为什么外部变量可以在Ruby中的迭代器中发生变化?

时间:2013-12-06 23:43:52

标签: ruby

value = 2

def change
  value = 3
end

puts value

3.times do
  value = 0
end
puts value

产生2,0。为什么迭代器会改变范围外变量?我如何确保它不会改变它?

2 个答案:

答案 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)

这是因为在doend之间的每次迭代中评估的代码都是用Proc的实例表示的(它们被称为块或闭包)。

来自Ruby文档:

  

Proc对象是已绑定到一组本地的代码块   变量。绑定后,可以在不同的上下文中调用代码   并仍然访问这些变量。

根据定义,您无法避免从块内部更改这些引用。