1. ホーム
  2. ruby

[解決済み] Rubyの@@variableはどういう意味ですか?

2022-03-14 18:44:36

質問

Rubyの変数で、ダブルアットマークが付くものは何ですか? @@ )? 私の理解では、アットマークで始まる変数は、PHPのこのようなインスタンス変数だと思うのですが。

PHPバージョン

class Person {

    public $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

Ruby版

class Person

    def set_name(name)
        @name = name
    end

    def get_name()
        @name
    end
end

ダブルアット記号は何を意味するのか @@ の意味と、シングルのアットマークとの違いを教えてください。

解き方は?

をプレフィックスとする変数 @ インスタンス変数 という接頭辞を持つものに対し @@ クラス変数 . 次の例を見てください。 puts の行になります。

class Test
  @@shared = 1

  def value
    @@shared
  end

  def value=(value)
    @@shared = value
  end
end

class AnotherTest < Test; end

t = Test.new
puts "t.value is #{t.value}" # 1
t.value = 2
puts "t.value is #{t.value}" # 2

x = Test.new
puts "x.value is #{x.value}" # 2

a = AnotherTest.new
puts "a.value is #{a.value}" # 2
a.value = 3
puts "a.value is #{a.value}" # 3
puts "t.value is #{t.value}" # 3
puts "x.value is #{x.value}" # 3

を見ることができます。 @@shared はクラス間で共有されます。あるクラスのインスタンスに値を設定すると、そのクラスの他のすべてのインスタンス、さらには子クラスの値も変更され、そこで @shared で、1つの @ はないだろう。

[更新】のお知らせ]

Phrogzがコメントで触れているように、Rubyではクラスレベルのデータをインスタンス変数で追跡するのが一般的なイディオムです。 クラス自体に . これは頭を悩ませる問題であり、また、多くの 補足説明 を変更するようなものだと考えてください。 Class クラスがありますが だけ のインスタンスは Class クラスを使用します。一例です。

class Polygon
  class << self
    attr_accessor :sides
  end
end

class Triangle < Polygon
  @sides = 3
end

class Rectangle < Polygon
  @sides = 4
end

class Square < Rectangle
end

class Hexagon < Polygon
  @sides = 6
end

puts "Triangle.sides:  #{Triangle.sides.inspect}"  # 3
puts "Rectangle.sides: #{Rectangle.sides.inspect}" # 4
puts "Square.sides:    #{Square.sides.inspect}"    # nil
puts "Hexagon.sides:   #{Hexagon.sides.inspect}"   # 6

を入れました。 Square の例(これは nil ) を使って、100% 期待通りの動作にならない可能性があることを示します。 上記リンク先の記事 には、このテーマに関する追加情報がたくさんあります。

また、他のデータと同様に マルチスレッド環境 dmarkowさんのコメントにもあるように。