次の例で、モジュールのクラス変数へのアクセスが失敗する理由がわかりません。
module M
@@xyz = 123
end
M.class_variables # [:@@xyz]
M.class_variable_get :@@xyz # 123 , so far so good
class C
extend M
end
C.singleton_class.class_variables # [:@@xyz]
C.singleton_class.class_variable_get :@@xyz # NameError:
# uninitialized class variable @@xyz in Class
のシングルトンクラスでクラス変数@@xyz
が突然アクセス不能/未定義になった理由を誰か説明できますか?C
更新: Ruby YARV のさまざまなバージョンで上記のコードを再テストしたところ、最新版ではリグレッションであることがわかりました。
更新 2:
Module#class_variables
Rubyの最新世代でメソッドの定義に変更がありました。
Ruby 1.9.3 までの定義は
class_variables → 配列
mod 内のクラス変数の名前の配列を返します。
Ruby 2.0.0 最新の安定版
class_variables(inherit=true) → 配列
mod 内のクラス変数の名前の配列を返します。これには、inherit パラメーターが false に設定されていない限り、含まれるモジュール内のクラス変数の名前が含まれます。
そのため、最新の Ruby 化身でclass_variables
は、デフォルトでインクルードされたモジュールのクラス変数も返します。この機能が何のためのものなのか、または「含まれている」モジュールと含まれていないモジュールにまだ関係があるかどうかに興味がinclude
ありextend
ます。
誰でも説明できますか?