この質問は特に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)"
私を混乱させるのは4行目です。これが nil ではなく「local-variable」を出力する理由がわかりません。これは、ラムダがどういうわけか「遠くを見ている」ことを暗示しているようです。(defined?
オペレーターであることはこれと関係があると思います。)
また、バインディングは定義されていると言っていますが、次のように使用しようとしています:
p b.binding.eval "a"
6 行目の割り当ての前に NameError が発生します。
編集:これをテストしました
- 1.9.3-362
- 1.9.3-374
- 2.0.0-プレビュー2
すべてのケースで同じ動作が得られます。