Rubyのクラスインスタンス変数、クラスインスタンスメソッドとクラス変数、クラスメソッドの違いについて
Rubyにおけるクラスインスタンス変数、クラスインスタンス・メソッド、クラス変数・メソッドの違いは微妙で、使い方もかなり異なります。この記事では、それらの定義と基本的な使用シナリオを調査し、光を当てる...
I. クラスインスタンス変数とクラス変数
クラス変数は誰もが知っている、クラス定義にある@@で始まる変数のことです。クラス変数は、クラスのグローバルな情報を格納するために使用され、クラスのオブジェクトごとにデータのコピーを持つクラスインスタンス変数(つまり@で定義された変数)とは異なり、そのクラスのみに属します。クラス変数は継承することができるので、サブクラスを派生させれば、サブクラス内の親クラスのクラス変数にアクセスすることができます。子クラスと親クラスはデータのコピーを共有し、一方のクラスに対する変更は他方のクラスに反映されます。下のコードは実行結果を示しています。
class A
# class variables must be assigned before they can be accessed, otherwise there will be an "uninitialized class variable" error
@@alpha=123 # Initialize @@alpha
@@beta=456 #Initialize @@beta
@@gamma=789 #Initialize @@gamma
def A.alpha
@@alpha
end
def A.alpha=(x)
@@alpha=x
end
def A.beta
@@beta
end
def A.beta=(x)
@@beta=x
end
def A.gamma
@@gamma
end
def A.gamma=(x)
@@gamma=x
end
def A.look
puts "#@@alpha, #@@beta, #@@gamma"
end
end
class B<A
end
#initial data
A.look
B.look
#Modify class variables in the parent class
A.alpha=111
A.look
B.look
走った結果
123, 456, 789
123, 456, 789
111, 456, 789
111, 456, 789
では、クラスのインスタンス変数とは何でしょうか?クラスのインスタンス変数とは、クラスのクラスメソッド内またはクラスメソッド外(インスタンスメソッド内ではない、クラスのインスタンス変数)で、@で始まる変数として定義されたものです。このように定義された変数の値は、クラスオブジェクト自身に属するもので、サブクラスに継承させることはできません。クラスオブジェクトというと少しわかりにくいかもしれませんが、実はRubyではすべてまとめてオブジェクトであり、私たちが定義するクラスやRubyの組み込みクラスはそれ自体がメタクラスのオブジェクトなのです。ですから、サブクラスと共有する必要があるクラスのグローバルデータを定義したい場合は、クラス変数を使います。しかし、クラス自身だけのグローバルデータを定義したい場合は、クラスインスタンス変数を使えばいいのです。また、クラス変数と異なり、クラスインスタンス変数はアクセスする前に値を代入する必要がなく、代入されない場合は値がnilとなる点にも注意が必要です。例を見て、もう少しわかりやすく説明すると......。
class A
The class instance variables of class # can be assigned or unassigned before access, unassigned is nil
@alpha=123 # Initialize @alpha
@beta=456 #Initialize @beta
@gamma=789 #Initialize @gamma
def A.alpha
@alpha
end
def A.alpha=(x)
@alpha=x
end
def A.beta
@beta
end
def A.beta=(x)
@beta=x
end
def A.gamma
@gamma
end
def A.gamma=(x)
@gamma=x
end
def A.look
puts "#@alpha, #@beta, #@gamma"
end
end
class B<A
end
A.look
B.look
コードは以下のように実行されます。
123, 456, 789
, ,
nil
関連
最新
-
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 実装 サイバーパンク風ボタン