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