我的理解是ruby块有块作用域,在块中创建的所有变量都只存在于块中。
示例案例:
food = ['toast', 'cheese', 'wine']
food.each { |food| puts food.capitalize}
puts food
输出:
"Toast"
"Cheese"
"Wine"
"Wine"
如果在块(每个块)中使用
food
变量,我的理解是它具有块范围。它只存在于块范围内,对外部变量没有任何影响。但是行为不同,在本例中修改名为
food
的外部变量。这种理解正确吗,在ruby中我们有块作用域吗? 最佳答案
这是Ruby1.8的预期行为。It was fixed > AA>下面的代码片段是用Ruby1.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"]