[ruby-list:50632] Re: instance_evalで定数が見えない

From: Masahiro Utsumi <utsumi@...>
Date: 2017-12-29 08:39:58 UTC
List: ruby-list #50632
内海@ベルギーです

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