No.1ベストアンサー
- 回答日時:
クラス変数は同一クラスのインスタンス間で同じ変数を用意します。
なので、インスタンスfooでセットした値がインスタンスbarで読めます。
インスタンス変数は、各インスタンスで別々の変数を用意します。
なのでインスタンスfooでセットした値は、インスタンスbarでは読めません。
インスタンスbarで読めるのは、インスタンスbarでセットした値です。
クラス変数は、当然アクセスメソッドも書けます(インスタンス変数みたいに楽が書き方はできませんが)
class Foo
attr_accessor :b
def initialize
@@a = 0 #クラス変数初期化
@b = 0 #インスタンス変数初期化
end
def set_a(x) # クラス変数@@aに設定
@@a = x
end
def get_a # クラス変数@@aの値読み出し
@@a
end
def print_var
puts "@@a = #{@@a}"
puts "@b = #{@b}"
end
end
foo = Foo.new
bar = Foo.new
puts "インスタンスfooの変数を表示"
foo.print_var
puts "インスタンスbarの変数を表示"
bar.print_var
puts "インスタンスfooのクラス変数@@aに10をセット"
foo.set_a(10)
puts "インスタンスfooのインスタンス変数@@aに20をセット"
foo.b = 20
puts "インスタンスfooの変数を表示"
foo.print_var
puts "インスタンスbarの変数を表示"
bar.print_var
puts "インスタンスbarのクラス変数@@aに100をセット"
bar.set_a(100)
puts "インスタンスbarのインスタンス変数@@aに200をセット"
bar.b = 200
puts "インスタンスfooの変数を表示"
foo.print_var
puts "インスタンスbarの変数を表示"
bar.print_var
実行結果
インスタンスfooの変数を表示
@@a = 0
@b = 0
インスタンスbarの変数を表示
@@a = 0
@b = 0
インスタンスfooのクラス変数@@aに10をセット
インスタンスfooのインスタンス変数@@aに20をセット
インスタンスfooの変数を表示
@@a = 10
@b = 20
インスタンスbarの変数を表示
@@a = 10 ←インスタンスfooに書いた値が読める
@b = 0 ←インスタンスfooに書いた値は読めない
インスタンスbarのクラス変数@@aに100をセット
インスタンスbarのインスタンス変数@@aに200をセット
インスタンスfooの変数を表示
@@a = 100 ←インスタンスbarに書いた値が読める
@b = 20 ←インスタンスbarに書いた値は読めない
インスタンスbarの変数を表示
@@a = 100
@b = 200
この回答へのお礼
お礼日時:2012/03/24 22:02
とてもわかりやすい例をあげて説明してくれて有難うございます。
すごい理解がふかまりました。
同一IDのインスタント内でのみ共有可能なんですね。
クラスはそのクラス自体で共有可能だってこともこれでわかりました。
ありがとうございました!!
No.2
- 回答日時:
>スコープの違い
スコープというのはソース上のレキシカルなスコープということでいいですか?
どちらも自明ですが、クラス変数は、class文から対応するend文までの間すべて。
インスタンス変数はインスタンスメソッドを定義するdef文と対応するend文の間。
もし、変数の生存期間のことであれば、クラス変数は最初に代入されてからプログラム終了までずっと。インスタンス変数はオブジェクトの生成後、最初に代入または参照されてからそのオブジェクトが参照されなくなるまで。
>あとクラス変数にはセッターやゲッター等のアクセスメソッドを設定できるんですか?
自分でdef ~ endで定義すれば出来ます。attr_accessor のような仕組みは無いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(ソフトウェア) Figma 1 2023/06/23 14:22
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(SNS・コミュニケーションサービス) 大至急お助け下さい。マストドンの或るインスタンスに登録したいのですが、ユーザー名で半角英数とアンダー 1 2023/08/25 10:33
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1、Rstudioで回帰直線を求める...
-
C言語の入力した文字を反転させ...
-
ビーリアルのユーザー名を変え...
-
pandasでsqlite3にテーブル作成...
-
なんで if __name__ == "__main__"
-
100万件越えCSVから条件を満た...
-
秀丸エディタで、同じ記号で囲...
-
(再質問)エクセルのマクロボ...
-
パソコンのスクリーンセーバー...
-
pythonの常時実行
-
Ruby on railsをrails sで立ち...
-
Accessで文字列のバイト数読み込み
-
WSLのUbuntuで、Railsのインス...
-
GitHubは初年度以外は有料にな...
-
教えてください
-
GitHubについて
-
Rubyのみでスレがあってそこに...
-
IDLE.Shell 3.10.0
-
プログラミング初学者の勉強方法
-
VBA メモ帳の上書き保存がしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数の引数に複数のユーザ定義...
-
インスタンス変数とクラス変数...
-
インスタンスとオブジェクト
-
子クラスのインスタンスから親...
-
書籍 メタプログラミングRuby...
-
クラスメソッドのインスタンス...
-
ImageButtonのマウスオーバーが...
-
ストリームへの保存処理
-
::ってなに?
-
Pythonについてです。 何回見直...
-
Ruby 特異メソッドのnewが先に...
-
お互いをメンバに持つようなク...
-
get() と find() の違いについて
-
「arg」は何の略?
-
エクセルVBA オートフィルタで...
-
教えてください。vb5.0
-
テンプレートの特殊化でコンパ...
-
What class are you in? には何...
-
変数の隠蔽とは?
-
エラー「メソッドまたはデータ...
おすすめ情報