这是 ruby 1.8 的预期行为。它已在 1.9中修复 。下面的片段使用 ruby 1.9.3 运行
food = ['toast', 'cheese', 'wine']
food.each { |food| puts food.capitalize.inspect} # !> shadowing outer local variable - food
puts food.inspect
# >> "Toast"
# >> "Cheese"
# >> "Wine"
# >> ["toast", "cheese", "wine"]
您是对的,food从块的范围限定为该块并使用此名称隐藏其他变量。但是如果你对它做一些破坏性的事情,它会反映在原始数组中,因为它是对数组元素的引用,而不是它的副本。观察:
food = ['toast', 'cheese', 'wine']
food.each { |f| f.capitalize} # transform and discard
food # => ["toast", "cheese", "wine"]
food.each { |f| f.capitalize! } # transform destructively (bang-version)
food # => ["Toast", "Cheese", "Wine"]