From: Koji Arai Date: 2000-11-26T22:26:03+09:00 Subject: [ruby-dev:11647] Re: class variable 新井です。 > まつもと ゆきひろです > > In message "[ruby-dev:11636] Re: class variable" > on 00/11/23, Koji Arai writes: > > |えっと、(A)でのクラス変数追加が許されるのは、クラスの特異ク > |ラス定義はそのクラスの定義と等価とみなしているということでしょ > |うか? > > そういうことですね。やりすぎかしら? これがやりすぎかどうかの判断は私にはむつかしいのですが、これ の意図するところは class Foo @@foo = 1 def foo @@foo end end と同じことを class << Foo @@foo = 1 def foo @@foo end end でもできるようにということなんですよね? マニュアル用に現時点でのクラス変数の説明を書いてみました。突っ 込み大歓迎。 = クラス変数 : 例: class Foo @@foo = 1 def foo @@foo end def foo=(v) @@foo = v end end `@@'で始まる変数はクラス変数です.クラス変数とはインスタンス 間で共有される変数のことです.クラス変数はクラス定義の中で初 期化(定義)され,クラス定義、メソッド定義内での参照/代入が可 能です. クラス変数は定数と似ていますが,以下の点で異なります. * 再代入可能(定数は警告を出す) * クラスの外から直接参照できない(継承されたクラスからは参照/代入可能) また,クラス自身のインスタンス変数とは以下の点で異なります. * 定義されていないクラス変数の参照/代入はエラー * サブクラスから親クラスのクラス変数の参照/代入が可能 * インスタンスメソッドから参照/代入が可能 特異クラス定義,特異メソッド定義においては以下に示すルールがあります. * 特異クラスのコンテキストでのクラス変数 * (A) 特異クラス定義の対象がクラス(またはモジュール)ならそのクラス変数 * (A') そうでなければ特異クラスのクラス変数 * 特異メソッド定義のコンテキストでのクラス変数 * (B) 特異メソッドのレシーバがクラス(またはモジュール)ならそのクラス変数 * (B') そうでなければそのオブジェクトのクラスのクラス変数 : 例: 〜略〜 -- 新井康司 (Koji Arai)