52

这段 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 之间的有理数的数量。(这是一个 Project Euler 问题)。所以我试图从内部块返回。

4

1 回答 1

57

您不能return在 Ruby *中的块内。最后一条语句成为返回值,因此您可以在您的情况下删除 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块。

于 2013-07-23T02:46:19.163 回答