意外返回(LocalJumpError)

时间:2013-07-23 02:42:31

标签: ruby ruby-2.0

这个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 (和其余零)的平面列表,其中 n 是分数低于8且在1/3和1之间的有理数的数量/ 2。 (it's a Project Euler problem)。所以我试图从内部区块返回。

1 个答案:

答案 0 :(得分:41)

Ruby * 中的块内不能return。最后一个语句成为返回值,因此您可以在您的情况下删除return语句:

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块。