在块中返回与下一个非本地返回

考虑这个破碎的片段:

def foo
  bar = [1, 2, 3, 4].map do |x|
    return 0 if x.even?
    x
  end
  puts 'baz'
  bar
end
foo # => 0

人们可能期望 returnmap 的块结果数组产生一个值。因此 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 的情况下,块返回的值是其最后一个表达式的值。