【发布时间】:2013-02-07 21:43:38
【问题描述】:
这个问题专门针对 Ruby 1.9.3:
p defined?(a)
p binding.eval "defined?(a)"
b = lambda { |x| x }
p b.binding.eval "defined?(a)" # This prints "local-variable"
p defined?(a) # This prints nil!
a = 2
p defined?(a)
p b.binding.eval "defined?(a)"
让我困惑的是第四行。我不确定为什么这会打印“局部变量”而不是零。这似乎暗示 lambda 在某种程度上“看得更远”。 (我认为defined? 是运营商与此有关。)
此外,虽然绑定表明它已定义,但尝试像这样使用它:
p b.binding.eval "a"
之前第 6 行的赋值导致 NameError。
编辑: 我已经对此进行了测试
- 1.9.3-362
- 1.9.3-374
- 2.0.0-preview2
我在所有情况下都得到相同的行为。
【问题讨论】:
-
您使用的 Ruby 的具体版本是什么(包括补丁级别)?我无法在 1.9.3-p374 上复制它。
-
@AndrewMarshall:1.9.3-p362。但是,我可以在 374 和最新的 2.0.0 预览版中复制此行为。 (让我再次强调一下,这只适用于批处理解释器,它不能以交互方式工作,因为解析 REPL 的工作方式不同)
-
你能定义“批处理解释器”吗?在 IRB、Pry 和 Ruby 中直接运行
->(o) { o }.binding.eval('defined? a')都给我nil。 -
@AndrewMarshall 通过
ruby file.rb运行它 -
等等,我可以复制它。我想我知道发生了什么。
标签: ruby metaprogramming