[ruby-list:50643] Re: 特異クラスでのクラス変数
From:
Akret Node <node.akret@...>
Date:
2018-01-08 08:05:24 UTC
List:
ruby-list #50643
まつもとさん
返答ありがとうございます。
定数のスコープですか、なるほどです。
サンプルを書いてみましたがおっしゃる通りでした。
だからトップレベルで使うと
そのスコープで探そうとするので失敗なのですね
class C
@@val = 10
end
module M
@@val = 20
class << C
p @@val # 20と表示される
end
end
2018年1月8日 13:12 Yukihiro Matsumoto <matz@ruby.or.jp>:
> まつもと ゆきひろです
>
> クラス変数は同じクラスに所属するもの(クラス定義本体、インス
> タンスメソッド、クラスメソッドなど)で情報を共有するためのも
> のですから、これらの間で共有するのは定義上当然です。そして、
> クラスの特異クラスはクラスメソッド(クラスの特異メソッド)を保
> 持するためのクラスですから、元々のクラスとクラス変数を共有す
> るようになっています。
>
> クラス変数のスコープはレキシカルに決定しますが、そのスコープ
> は同じレキシカルでもローカル変数のスコープではなく、定数のス
> コープです。class文は新しいローカル変数のスコープを導入し、
> 上位のスコープ(外側)を隠蔽しますが、定数に関しては上位を隠蔽
> しません。
>
> まつもと ゆきひろ /:|)
>
>
> In message "Re: [ruby-list:50641] 特異クラスでのクラス変数"
> on Mon, 8 Jan 2018 02:15:35 +0900, Akret Node <node.akret@gmail.com> writes:
>>
>>のぐちと申します。
>>
>>特異クラスの中でクラス変数を定義した場合に
>>クラスと共有する理由はなんでしょうか??
>>
>>class C
>> class << self
>> FOO = "foo"
>> @@bar = "bar"
>> @bazz = "bazz"
>> end
>>end
>>
>>p C.const_get :FOO # 例外
>>p C.singleton_class.const_get :FOO # "foo"
>>
>>p C.class_variable_get :@@bar # "bar"
>>p C.singleton_class.class_variable_get :@@bar # "bar"
>>
>>p C.instance_variable_get :@bazz # nil
>>p C.singleton_class.instance_variable_get :@bazz # "bazz"
>>
>>また、class << 構文をトップレベルに書いた場合に
>>クラス変数を定義するとトップレベル(Object)に定義するようです。
>>一寸、レキシカルに決定しているように見えますが
>>class << 構文はレキシカルスコープを別途つくりますよね?
>>
>>val = 10
>>class << Object
>> p val # ブロックのようにはならず例外が発生する
>>end
>>
>>この動作は若干、混乱するのですがこの構文解釈にいたった経緯はなんでしょう?