Consider this broken snippet:
def foo bar = [1, 2, 3, 4].map do |x| return 0 if x.even? x end puts 'baz' bar end foo # => 0
One might expect
return to yield a value for
map's array of block results. So the return value of
foo would be
[1, 0, 3, 0]. Instead,
return returns a value from the method
foo. Notice that
baz isn't printed, which means execution never reached that line.
next with a value does the trick. It acts as a block-level
def foo bar = [1, 2, 3, 4].map do |x| next 0 if x.even? x end puts 'baz' bar end foo # baz # => [1, 0, 3, 0]
In the absence of a
return, the value returned by the block is the value of its last expression.