[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
>>
>>この動作は若干、混乱するのですがこの構文解釈にいたった経緯はなんでしょう?

In This Thread

Prev Next