From: Kazuhiro Yoshida Date: 2000-02-16T18:19:14+09:00 Subject: [ruby-dev:9229] Re: class variable (Re: bang method returns string always) もりきゅうです。 石塚圭樹 さんは書きました: >ただ, わたし的には, クラス変数が@Cvarとなったときに, クラス変数ではなく >てクラスのインスタンス変数を本当に用いたくなったときの変数の命名法を悩み >ますけどね(^^;;; クラスのインスタンス変数は class Circle @cins end とした時の @cins ( つまり @[^A-Z]\w* ) で対応できるのでは? でも,クラスのインスタンス変数って,どういう使い道があるのだろう? ちょっと,私なりに Ruby の変数・定数について考察してみます。 1. クラスのローカル変数と普通のローカル変数 class Circle x = 1 # (A) def show p x # (B) end end (A)(B) は区別される。 # この場合 (B) で NameError 2. クラスのインスタンス変数と普通のインスタンス変数 class Circle @foo = 1 # (A) def show p @foo # (B) end end 現状(ruby 1.4) では, (A) の @foo はクラス自身 (Circle object) のインスタンス変数であり, (B) の @foo は普通の (つまりクラスのインスタンスの内部情報としての) インスタンス変数であるから,(A)(B) の @foo は区別される。 この場合 (B) は nil を返す。 このインスタンス変数の振る舞いは,クラス変数を導入しても変わらない。 ... ここまでは ok なのかな? # なんか,表現するのが難しいなあ ええと,以下,クラス変数を @Cvar ( つまり @[A-Z]\w* ) と表すように なったと仮定します。 3. クラス変数 class Circle @Id = 0 # (A) def initialize(r) @Id+= 1 # (B) end end (A) クラス Circle のクラス変数 @Id いや,(A) クラス Circle 自身のクラス変数 @Id か? (B) クラス Circle のクラス変数 @Id さて,(A)(B) は区別されるのか? 区別されるとすれば,@Id はどうやって初期化するのか? 4. クラス定数 class Circle PI = 3.14159 # (A) def initialize p PI # (B) end end (A)(B) Circle クラスの定数 PI #=> 同一 * 結論めいたこと クラス変数とクラス定数は同格に扱われるべきだろうから, 3. の (A)(B) における @Id は,同一だとするのが妥当。 クラスのインスタンス変数は,使い道がなさそう。^^; # 継承とか Mix-in したりすると,生きてくるのかな? あと,参照の仕方もまとめてみたいけど... 眠い。 ---- Kazuhiro Yoshida moriq.kazuhiro@nifty.ne.jp