[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)
> >> ***  
> >   
> 

In This Thread