Unexpected Return (LocalJumpError)
ruby, ruby-2.0
Solution
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.
Problem
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.