[ruby-list:50642] Re: 特異クラスでのクラス変数
From:
Yukihiro Matsumoto <matz@...>
Date:
2018-01-08 04:12:53 UTC
List:
ruby-list #50642
まつもと ゆきひろです
クラス変数は同じクラスに所属するもの(クラス定義本体、インス
タンスメソッド、クラスメソッドなど)で情報を共有するためのも
のですから、これらの間で共有するのは定義上当然です。そして、
クラスの特異クラスはクラスメソッド(クラスの特異メソッド)を保
持するためのクラスですから、元々のクラスとクラス変数を共有す
るようになっています。
クラス変数のスコープはレキシカルに決定しますが、そのスコープ
は同じレキシカルでもローカル変数のスコープではなく、定数のス
コープです。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
>
>この動作は若干、混乱するのですがこの構文解釈にいたった経緯はなんでしょう?