Ruby 迭代器块内的词法作用域

Ruby lexical scope inside 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)吗?

提前致谢!

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

当 Ruby 解析器看到序列 identifierequal-signvalue,在这个表达式中,

a = 123

它为局部变量a分配了space。变量的创建 - 不是为其赋值,而是变量的内部创建 - 总是作为这种表达式的结果发生,如果代码未执行则事件。