18b*_*tes 13 ruby scope block variable-assignment
我的理解是ruby块具有块范围,并且块内创建的所有变量将仅在块内生存.
示例案例:
food = ['toast', 'cheese', 'wine']
food.each { |food| puts food.capitalize}
puts food
Run Code Online (Sandbox Code Playgroud)
输出:
"Toast"
"Cheese"
"Wine"
"Wine"
Run Code Online (Sandbox Code Playgroud)
如果你把food块中的变量(每个块),我的理解是它有块范围.它仅存在于块范围内,并且对外部变量没有任何影响food.
但行为不同,food在这种情况下修改了名为的外部变量.这种理解是否正确,在ruby中我们是否有块范围?
Ser*_*sev 13
这是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"]
Run Code Online (Sandbox Code Playgroud)
你是正确的,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"]
Run Code Online (Sandbox Code Playgroud)