2

クラス変数を使用したモジュールのインクルージョンを理解しようとしています。クラス変数を含むモジュールを含めると、クラス変数もクラス定義に含まれると思いました。

これは意図したとおりに機能します。

module A 
  @@my_name = "rick"
  def print_name
    puts @@my_name
  end
end

class Y 
  include A
  extend A
end

Y.print_name

しかし、これはしません:

module A

  def self.included(klass)
    klass.include B
    klass.extend C
  end

  module B
    @@my_name = "bob"
  end

  module C 
    def print_name
      puts @@my_name
    end
  end

end

class Y
  include A
end

Y.print_name

「ボブ」を期待していましたが、代わりに次のようになりました:

A::C の初期化されていないクラス変数 @@my_name

4

2 に答える 2

-1

モジュールを先頭に追加しようとするとどうなりますか? これにより、モジュールがクラスに追加されますが、クラスのメソッドの前に挿入されます。これは、変数の名前付けの競合が発生した場合に、モジュールが勝つことを保証する方法です。

これはコメントとしての意味ですが、私のユーザー評価はまだコメントとして十分に高くないため、これが的外れである場合は申し訳ありません.

于 2016-12-15T03:01:29.097 に答える