【Ruby】クラスの中のアットマークの意味。@と@@の違いについて。
##@と@@の違い
どちらも変数を表す。インスタンスで使う変数か、クラスで使う(すべてのインスタンスで共通)の変数かの違い。
項目 | 意味 | 使い方 |
---|---|---|
@ | インスタンス変数 | @<変数名> |
@@ | クラス変数 | @@<変数名> |
##インスタンス変数とクラス変数の使い方
###インスタンス変数
インスタンス変数は、生成したインスタンスごとに値がセットされるため、それぞれで固有となる。
class Aaa
#インスタンス変数を定義
def setName(lastname, firstname)
@name = lastname + " " + firstname
end
#メソッドを定義
def hello
p "#{@name}さん"
end
end
#インスタンスの生成
p1 = Aaa.new
p2 = Aaa.new
#インスタンス変数に名前をセット
p1.setName("山田", "克巳")
p2.setName("田中", "次郎")
#インスタンスメソッドの呼び出し
p1.hello # => "山田 克巳さん"
p2.hello # => "田中 次郎さん"
###クラス変数
クラス変数は、すべてのインスタンスで共通となる。上書きされるため、後からセットした値が入る。
class Aaa
#クラス変数を定義
def setName(lastname, firstname)
@@name = lastname + " " + firstname
end
#メソッドを定義
def hello
p "#{@@name}さん"
end
end
#インスタンスの生成
p1 = Aaa.new
p2 = Aaa.new
#インスタンス変数に名前をセット
p1.setName("山田", "克巳")
p2.setName("田中", "次郎")
#インスタンスメソッドの呼び出し
p1.hello # => "田中 次郎さん"
p2.hello # => "田中 次郎さん"
各インスタンス毎で名前をセットしたが、後からセットした名前で上書きされるため、出力はどちらも後からセットした値になる。