From: Masahiro Utsumi Date: 2017-12-29T09:39:58+01:00 Subject: [ruby-list:50632] Re: instance_evalで定数が見えない 内海@ベルギーです instance_evalはその名前のとおり、インスタンスを evaluate しているのだと考えています。 なのでクラス定数を見たければ p self.class::CONST とすれば見ることができます。 定数だけでなくクラス・メソッドになりそうに見えるコード def self.hi3 p self.class::CONST end も、instance_eval内ではインスタンスメソッドになりますね。 一見わかりにくく思えますが、考えればロジカルだと思います。 On 2017/12/29 1:51, Yukihiro Matsumoto wrote: > まつもと ゆきひろです > > 定数の参照はレキシカルに決定されますので、instance_evalなど > では変化しません。 > > > In message "Re: [ruby-list:50630] instance_evalで定数が見えない" > on Fri, 29 Dec 2017 03:24:26 +0900, MASAKI Haruka writes: >> >> 正木です。 >> >> Ruby 2.2のときにも言及したのですが、2.5でも変わっていないので再度お聞かせ下さい。 >> インスタンスの特異クラス内では見えるクラスの定数が、instance_evalでは見えません。 >> >> これは然るべき挙動なのでしょうか。 >> >> *** >> コード: >> >> class ClassA >> CONST="Hello" >> end >> >> obj = ClassA.new >> >> class <> def hi1 >> p CONST >> end >> end >> >> obj.instance_eval do >> def hi2 >> p CONST >> end >> end >> >> >> 結果: >> >> "Hello" >> Traceback (most resent call last): >> 1: fron instance_eval_test.rb:20:in `
' >> instance_eval_test.rb:15:in `hi2': uninitialized constant CONST (NameError) >> *** >