在塊中返回與下一個非本地返回

考慮這個破碎的片段:

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 的情況下,塊返回的值是其最後一個表示式的值。