rubyのクラス変数とクラスインスタンス変数

1844 ワード

詳細
まず、ruby 1.8のクラス変数はすべてのサブクラスと親クラスが共有しています.次のコードを参照してください.
class IntelligentLife  
  @@home_planet = nil
  
  def self.home_planet
    @@home_planet
  end
  def self.home_planet=(x)
    @@home_planet = x
  end
  #...
end
class Terran < IntelligentLife
  @@home_planet = "Earth"
end

class Martian < IntelligentLife
  @@home_planet = "Mars"
end


p IntelligentLife.home_planet
p Terran.home_planet
p Martian.home_planet

結果は同じで、すべて「Mars」であることがわかります.これは、親クラスのクラス変数が継承システム全体で共有するためである.
ここでは、クラスインスタンス変数が厳格なper-classであるため、必要な結果を得るには、クラスインスタンス変数を使用します.継承システム全体で共有されるのではなく、
class IntelligentLife  
  @home_planet = nil
  
 class << self
    attr_accessor :home_planet
  end
end
class Terran < IntelligentLife
  @home_planet = "Earth"
end

class Martian < IntelligentLife
  @home_planet = "Mars"
end


p IntelligentLife.home_planet
p Terran.home_planet
p Martian.home_planet

1.9では、クラス変数は継承システムによって共有されません.つまりjavaの静的変数とはあまり差がありません.
次のコードは1.9で実行する.
class IntelligentLife  
  @@home_planet = "bobo"
  def self.home_planet
    @@home_planet
  end
end
class Terran < IntelligentLife
  @@home_planet = "Earth" 
end

class Martian < IntelligentLife
  @@home_planet = "Mars"
  def self.home_planet
    @@home_planet
  end
end


p IntelligentLife.home_planet
p Terran.home_planet
p Martian.home_planet

このときのクラス変数こそ真のクラス変数、すなわちper-classであることがわかる.