Неожиданное Возвращение (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
блоки.