先頭に 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 のコメントの通り。