Unexpected Return (LocalJumpError)

RubyRuby 2.0

Ruby Problem Overview


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.

Ruby Solutions


Solution 1 - Ruby

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEli RoseView Question on Stackoverflow
Solution 1 - RubysarahhodneView Answer on Stackoverflow