迭代器块内的Ruby词法范围

时间:2018-01-26 15:01:40

标签: ruby scope iterator block

在Ruby(v2.5.0)中......

[1,2,3].map do |i|
  if i.eql?(3)
    a = 123
  end
  defined?(a)
end
=> ["local-variable", "local-variable", "local-variable"]

有人可以向我解释a在第一次和第二次迭代中local-variable nil(等于<script src="/js/gifler.min.js"></script>)的情况,如果在第三次和第二次迭代中未设置...迭代?

提前致谢!

1 个答案:

答案 0 :(得分:2)

我将回答引用A.Black的一本书: Well Ground Ground Rubyist ,第6章,p。 158.(2014年第二版):

当Ruby解析器看到序列标识符等号时,就像在此表达式中一样,

a = 123

它为局部变量a分配空间。变量的创建 - 不是为它赋值,而是为变量的内部创建 - 总是作为这种表达式的结果发生,如果代码没有被执行则发生。