Подтвердить что ты не робот

Неожиданное возвращение (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. (это проблема Project Euler). Поэтому я пытаюсь вернуться из внутреннего блока.

4b9b3361

Ответ 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.