意外返回(LocalJumpError)

问题描述 投票:45回答:1

此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)。所以我想从内部块返回。

ruby ruby-2.0
1个回答
51
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.