value = 2
def change
value = 3
end
puts value
3.times do
value = 0
end
puts value
产生2,0。为什么迭代器会改变范围外变量?我如何确保它不会改变它?
答案 0 :(得分:2)
块可以访问容器范围。要阻止访问块中的value
,您可以使用块本地var,如此
value = 2
def change
value = 3
end
puts value
3.times do |;value|
value = 0
end
puts value
请参阅this关于ruby范围的精彩文章
答案 1 :(得分:-1)
这是因为在do
和end
之间的每次迭代中评估的代码都是用Proc的实例表示的(它们被称为块或闭包)。
来自Ruby文档:
Proc对象是已绑定到一组本地的代码块 变量。绑定后,可以在不同的上下文中调用代码 并仍然访问这些变量。
根据定义,您无法避免从块内部更改这些引用。