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

インスタンス変数とクラス変数の違いで悩んだので実験してみた。

比較しやすいように内部変数がクラス変数かインスタンス変数かの違い以外は
同じ構造のクラスを作り、同じ様にメソッドをCallしてみる。

class Instance

  def changeInstanceValue(inputStr)
    puts "#{inputStr}が挿入されました"
    @instanceObject = inputStr
  end
  
  def callObjectValue 
    puts @instanceObject
  end
end

first = Instance.new
second = Instance.new

first.changeInstanceValue("1番目の変更"); 
second.changeInstanceValue("2番目の変更"); 

first.callObjectValue
second.callObjectValue

# 1番目の変更が挿入されました
# 2番目の変更が挿入されました
# 1番目の変更
# 2番目の変更


インスタンス変数ではインスタンスごとに変更した値が出力される。
つまり、インスタンス変数として定義した変数はインスタンスごとに値が保持されることになる。

class ClassInstance
  @@instanceObject = "これはクラス変数です"

  def changeInstanceValue(inputStr)
    puts "#{inputStr}が挿入されました"
    @@instanceObject = inputStr
  end
  
  def callObjectValue 
    puts @@instanceObject
  end
end

first = ClassInstance.new
second = ClassInstance.new

first.changeInstanceValue("1番目の変更"); 
second.changeInstanceValue("2番目の変更"); 

first.callObjectValue
second.callObjectValue

# 番目の変更が挿入されました↲
# 2番目の変更が挿入されました↲
# 2番目の変更
# 2番目の変更

一方クラス変数は最初に設定した値が2回目の設定値で上書きされている。
つまり、変数をインスタンスで共有しているということになる。


結果を纏めると...

当たり前といえば当たり前の様な気もするけど一応確認できたので良し。