2

モジュールを使用してオブジェクト インスタンスを拡張する際に、特に Module クラスで extends_object コールバックを定義するときに問題が発生しました。私の理解では、次のようなことをすると次のようになります。

(s = String.new).extend SomeModule

SomeModule extends_object コールバックが呼び出されます。これは事実のようですが、コールバックを含めると、SomeModule で定義されたインスタンス メソッドはどれもオブジェクトに表示されません。いくつかのコードはこれをよりよく説明するはずです:

module M1
  def self.extend_object(o)
  end

  def test_method
    true
  end
end

module M2
  def test_method
    true
  end
end

(x = String.new).extend(M1)
(y = String.new).extend(M2)

それで、

x.methods.include?("test_method")
=> false
y.methods.include?("test_method")
=> true

すなわち、

x.singleton_methods
=> []
y.singleton_methods
=> ["test_method"]

何か案は?

参照:

http://www.ruby-doc.org/core/classes/Module.html#M001660
http://www.ruby-doc.org/core/classes/Object.html#M000337
4

3 に答える 3

3

同僚の助けを借りて、superそれ以外の場合はノープと呼ぶ必要があることに気付きました。ありがとう。

于 2009-05-22T07:37:37.383 に答える
0

また、メソッド名はシンボルであるため、シンボルを使用する必要があります

module M1
  def self.extend_object(o)
    super
  end

  def test_method
    true
  end
end

(x = String.new).extend(M1)

x.methods.include?(:test_method)  #=> true
于 2012-04-29T14:50:39.073 に答える