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