1
1

More than 3 years have passed since last update.

【Ruby】クラスの中のアットマークの意味。@と@@の違いは?(インスタンス変数とクラス変数の実例)

Posted at

【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  # => "田中 次郎さん"

各インスタンス毎で名前をセットしたが、後からセットした名前で上書きされるため、出力はどちらも後からセットした値になる。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1