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 return
.
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.