What is the problem with this Ruby 2.0 code?
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
The error is in block (2 levels) in <main>': unexpected return (LocalJumpError)
. I want to create a flat list containing n ones (and the rest zeroes) where n is the number of rational numbers with denominators below 8 which are between 1/3 and 1/2. (it's a Project Euler problem). So I'm trying to return from the inner block.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With