11138


ruby初心者です。

クラスインスタンス変数について勉強しております。  
class << self; endで定義した@valですが、  
クラスの先頭で定義した@val = 10とは違うインスタンスのようです。

class << クラス名; end はクラスメソッドを定義するイディオムである  
認識なので、@valはクラスインスタンス変数であると思うのですが違うのでしょうか

[code]

    class Ins
      @val = 10
    
      def foo
        @val
      end
    
      class << self
        @val = 15 #=> クラスインスタンス変数を参照しているようにみえる
    
        def bazz
          @val
        end
      end
    end
    
    class << Ins
      # puts self.bazz NoMethodErrorが発生する
      puts @val #=> ここでは15が出力される
    end
    
    puts Ins.bazz #=> ここでは10が出力される
    
[/code]


CC BY-SA 3.0
2015-06-08T14:11:40.390
11129
2015-06-08T23:35:08.443
8722
question
ruby
特異クラスのインスタンス変数について


次のコードを実行すると1個目の self と2個目の self が異なることがわかります。

[code]

    class Ins
      p self         #=> Ins
      class << Ins
        p self       #=> #<Class:Ins>
      end
    end
    
[/code]

`class << Ins` は Ins の特異クラスであり、Ins とは別のクラスです。


CC BY-SA 3.0
2015-06-08T23:35:08.443
11138
2015-06-08T23:35:08.443
3249
11129
answer