web-dev-qa-db-ja.com

予期しない戻り(LocalJumpError)

この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)にあります。 n1(および残りのゼロ)を含むフラットリストを作成したい(nは、1/3〜1/2の分母が8未満の有理数の数です。 ( これはプロジェクトオイラーの問題です )。だから、私は内側のブロックから戻ろうとしています。

40
Eli Rose

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ブロックの主な違いの1つです。メソッドに渡す「通常の」ブロックは、procブロックに似ています。

44
sarahhodne