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.

Original source