クラス変数・クラスインスタンス変数

こちらが詳しい。
クラスインスタンス変数


試してみる。

class Hoge
  @@class_hensu = 0
  @class_instance_hensu = 0

  def self.add_class_hensu
    @@class_hensu += 1
  end

  def self.add_class_instance_hensu
    @class_instance_hensu += 1
  end

  def self.class_hensu
    @@class_hensu
  end

  def self.class_instance_hensu
    @class_instance_hensu
  end
end


?> Hoge.add_class_hensu
=> 1
>> Hoge.add_class_hensu
=> 2
>> Hoge.add_class_hensu
=> 3
>> Hoge.class_hensu
=> 3
>> Hoge.add_class_instance_hensu
=> 1
>> Hoge.add_class_instance_hensu
=> 2
>> Hoge.add_class_instance_hensu
=> 3
>> Hoge.class_instance_hensu
=> 3
>> class Bar < Hoge
>> end
=> nil
>> Bar.class_hensu
=> 3
>> Bar.class_instance_hensu
=> nil
>> Hoge.class_variables
=> ["@@class_hensu"]
>> Bar.class_variables
=> ["@@class_hensu"]
>> Hoge.instance_variables
=> ["@class_instance_hensu"]
>> Bar.instance_variables
=> []

なるほど。。クラス変数は継承されるけど、クラスインスタンス変数は継承されない。
(継承という言い方は適当ではない気がする)


Class Variablesによると、
1.9では動作が異なるらしい。

試してみる。

C:\ruby-1.9.0-2-i386-mswin32\bin>irb
irb(main):001:0> class Hoge
irb(main):002:1>   @@class_hensu = 0
irb(main):003:1>   @class_instance_hensu = 0
irb(main):004:1>
irb(main):005:1*   def self.add_class_hensu
irb(main):006:2>     @@class_hensu += 1
irb(main):007:2>   end
irb(main):008:1>
irb(main):009:1*   def self.add_class_instance_hensu
irb(main):010:2>     @class_instance_hensu += 1
irb(main):011:2>   end
irb(main):012:1>
irb(main):013:1*   def self.class_hensu
irb(main):014:2>     @@class_hensu
irb(main):015:2>   end
irb(main):016:1>
irb(main):017:1*   def self.class_instance_hensu
irb(main):018:2>     @class_instance_hensu
irb(main):019:2>   end
irb(main):020:1> end
=> nil
irb(main):021:0> Hoge.add_class_hensu
=> 1
irb(main):022:0> Hoge.add_class_hensu
=> 2
irb(main):023:0> Hoge.add_class_hensu
=> 3
irb(main):024:0> class Bar < Hoge
irb(main):025:1> end
=> nil
irb(main):026:0> Bar.class_hensu
=> 3

あれ?いっしょちゃう?