[ruby-list:50634] Re: instance_evalで定数が見えない
From:
MASAKI Yuhsuke <yek@...>
Date:
2017-12-29 09:48:32 UTC
List:
ruby-list #50634
内海さん、ありがとうございます。 「あれ、でもinstance_evalでクラス変数にはアクセスできたよね…?」 と思ってやってみたところ、できませんでした。 なるほど… となると、「instance_eval内でクラスの情報にアクセスしたい」場合の、 どうするのが良いでしょうか。 アクセサかな? You wrote: > 内海@ベルギーです > > 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 <yek@reasonset.net> writes: > >> > >> 正木です。 > >> > >> Ruby 2.2のときにも言及したのですが、2.5でも変わっていないので再度お聞かせ下さい。 > >> インスタンスの特異クラス内では見えるクラスの定数が、instance_evalでは見えません。 > >> > >> これは然るべき挙動なのでしょうか。 > >> > >> *** > >> コード: > >> > >> class ClassA > >> CONST="Hello" > >> end > >> > >> obj = ClassA.new > >> > >> class <<obj > >> 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 `<main>' > >> instance_eval_test.rb:15:in `hi2': uninitialized constant CONST (NameError) > >> *** > > >