10

次の例で、モジュールのクラス変数へのアクセスが失敗する理由がわかりません。

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_variablesRubyの最新世代でメソッドの定義に変更がありました。

  • Ruby 1.9.3 までの定義は

    class_variables → 配列

    mod 内のクラス変数の名前の配列を返します。

  • Ruby 2.0.0 最新の安定版

    class_variables(inherit=true) → 配列

    mod 内のクラス変数の名前の配列を返します。これには、inherit パラメーターが false に設定されていない限り、含まれるモジュール内のクラス変数の名前が含まれます。

そのため、最新の Ruby 化身でclass_variablesは、デフォルトでインクルードされたモジュールのクラス変数も返します。この機能が何のためのものなのか、または「含まれている」モジュールと含まれていないモジュールにまだ関係があるかどうかに興味がincludeありextendます。

誰でも説明できますか?

4

4 に答える 4

0

要するに、モジュールがクラスと同じように機能しないためです。少し前に、私は上層部にこの質問をしました:ミックスインからクラス メソッドを継承する

そして、Module はいくつかの面では Class に似ていますが、別の面では Ruby はそれを単純に通常のオブジェクトとして扱うという結論に達しました。特に、クラス (クラス メソッド、クラス変数など) で「クラスのもの」として知られているものは、他のオブジェクト (シングルトン メソッドなど) では「シングルトンのもの」として知られています。また、モジュールのシングルトン クラスは多くの点でモジュールが通常のオブジェクトであるかのように扱われます。

于 2013-04-19T08:31:05.183 に答える