在块中返回与下一个非本地返回
考虑这个破碎的片段:
def foo
bar = [1, 2, 3, 4].map do |x|
return 0 if x.even?
x
end
puts 'baz'
bar
end
foo # => 0
人们可能期望 return
为 map
的块结果数组产生一个值。因此 foo
的返回值将是 [1, 0, 3, 0]
。相反, return
从方法 foo
返回一个值。请注意,baz
未打印,这意味着执行从未到达该行。
具有值的 next
可以解决问题。它充当了块级 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]
在没有 return
的情况下,块返回的值是其最后一个表达式的值。