这个Ruby 2.0代码有什么问题?

p (1..8).collect{|denom|
    (1...denom).collect{|num|
        r = Rational(num, denom)
        if r > Rational(1, 3) and r < Rational(1, 2)
            return 1
        else
            return 0
        end
    }
}.flatten

错误在block (2 levels) in <main>': unexpected return (LocalJumpError).我想创建一个包含n个1(以及剩余的0)的平面列表,其中n是分母小于8的有理数的个数,它们介于1/3和1/2之间.(it's a Project Euler problem). 所以我试着从内部返回.

推荐答案

在Ruby*中,一个块内不能有return个.最后一条语句将成为返回值,因此您只需删除 case 中的返回语句即可:

p (1..8).collect{|denom|
    (1...denom).collect{|num|
        r = Rational(num, denom)
        if r > Rational(1, 3) and r < Rational(1, 2)
            1
        else
            0
        end
    }
}.flatten

*:你可以在lambda个街区内:lambda { return "foo" }.call # => "foo".这与范围界定和所有这些有关,这是lambda个区块和proc个区块之间的主要区别之一.传递给方法的"普通"块更像是proc块.

Ruby相关问答推荐

ruby 组合哈希相关键

Ruby 避免类方法并保持其类型系统简单优雅的秘诀

Ruby 中无法解释的撬动行为

如何从外部获取给定 lambda 的参数值,而不显式返回其绑定?

Ruby注入daisy链?

有没有办法通过哈希初始化对象?

Ruby on Rails:你能把 Ruby 代码放在 YAML 配置文件中吗?

是否有Ruby单行如果 x 则返回?

为什么 ruby​​ 在 Windows 上这么慢?

在 Ruby 中,获取第一个块返回 true 的可枚举元素的最快方法是什么?

如何引用全局变量和类变量?

如何从 SystemStackError 中获取回溯:堆栈级别太深?

如何删除Ruby中数组中满足条件的所有元素?

在 Ruby 中查找内存泄漏的原因

如何在没有警告的情况下重新定义 Ruby 常量?

使用 RSpec 测试哈希内容

Ruby on Rails switch

如果公司使用 C++、C# 或 Java 作为应用程序语言,为什么要学习 Perl、Python、Ruby?

通过多个分隔符拆分字符串

JavaScript Array:获取项目的范围