You can't return
inside a block in Ruby*. The last statement becomes the return value, so you can just remove the return statements in your case:
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
*: You can inside lambda
blocks: lambda { return "foo" }.call # => "foo"
. It has to do with scoping and all that, and this is one of the main differences between lambda
blocks and proc
blocks. "Normal" blocks you pass to methods are more like proc
blocks.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…