Ruby で @@variable はどういう意味ですか? 質問する

Ruby で @@variable はどういう意味ですか? 質問する

先頭に 2 つのアット マーク ( ) が付いた 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

二重アットマークは何を@@意味し、単一のアットマークとどう違うのでしょうか?

ベストアンサー1

で始まる変数@インスタンス変数、が付くもの@@クラス変数次の例を確認してください。出力は行末のコメントにあります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 のコメントの通り。

おすすめ記事