19515


クラス`C`でcase 1のような定義をすると特異クラスに  
クラスインスタンス変数を定義できますが，  
クラス`C2`でcase 2のように定義すると特異クラスに  
クラス変数を定義できると思いましたが，以下の方法だとクラス`C2`に  
クラス変数を定義していることが確認できました．

[code]

    class C # case 1
      class << self
        @val = 100
      end
    end
    
    class C2 # case 2
      class << self
        @@val = 100
      end
    end
    
[/code]

確認したコマンド

[code]

    2.1.5 :002 > C2.singleton_class.class_variables
     => [] # ここが[:@@val]になると思ったが違う！
    2.1.5 :003 > C2.class_variables
     => [:@@val] 
    
[/code]

特異クラスにクラス変数を定義することは少ないかと思いますが，  
なぜこのようになるのでしょうか


CC BY-SA 3.0
2015-11-24T15:27:44.870
19257
2015-12-01T09:38:21.013
8722
question
ruby
Rubyでクラス変数の定義の仕方


特異クラスのclass式では、クラス変数に対するスコープを持てないようです。そのため、case 2の`@@val`は`class
C2`内のスコープ、つまり、C2クラスのクラス変数として扱われます。

参考: <http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fvariables.html#class>

> クラス変数は、その場所を囲むもっとも内側の( **特異クラスでない** ) class 式 または module 式のボディをスコープとして持ちます。


CC BY-SA 3.0
2015-12-01T09:38:21.013
19515
2015-12-01T09:38:21.013
7347
19257
answer