Неожиданное Возвращение (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). Я хочу создать плоский список, содержащий n единицы (и остальные нули) где n число рациональных чисел со знаменателями ниже 8, которые между 1/3 и 1/2. (это проблема проекта Эйлера). Поэтому я пытаюсь вернуться из внутреннего блока.

1 ответов


вы можете 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 блоки.