[解決済み] 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さんのコメントにもあるように。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] w(array)とはどういう意味ですか?
-
[解決済み] Rubyのmap(&:name)ってどういう意味?
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】StringからIntegerへの暗黙の変換がない(TypeError)?
-
[解決済み] Rubyで新しい文字列を作成せずに文字列をトリミングする標準的な方法は何ですか?
-
[解決済み】Ruby: 特定のバージョンのruby gemをインストールする方法は?
-
[解決済み] ルビー最大整数
-
[解決済み] あなたが提供した認証メカニズムはサポートされていません。AWS4-HMAC-SHA256を使用してください。
-
[解決済み] マトリックスサムネーションチャレンジ
-
[解決済み] 配列に何かを追加しようとしたときに、nil から整数への暗黙の変換が行われない。
-
[解決済み] 変数が整数であるかどうかのチェック
-
[解決済み] Rubyで指定されたディレクトリが存在するかどうかを確認する方法
-
[解決済み] Rubyのclass << selfイディオム