アンカットストーンの調査に基づいて構築された define_method() は、メインのシングルトン クラスに継承されません。
class <<self
p private_instance_methods(false)
end
--output:--
[:public, :private, :include, :using, :define_method]
...そして、私が判断できる限り、メソッドが継承されていない場合は、クラスで定義する必要があります。モジュールをインクルードすると、ruby は匿名クラスを作成し、モジュールの定義を匿名クラスに挿入し、メソッド ルックアップ チェーンのインクルード クラスのすぐ上に匿名クラスを挿入することに注意してください。たとえば、次のようになります。
module A
def greet
puts 'hi'
end
end
class Dog
include A
end
p Dog.instance_methods(false)
p Dog.instance_methods.grep(/^g/)
--output:--
[]
[:greet]
出力は、greet() が継承されたメソッドであることを示しています。しかし、define_method() は main の singleton クラスに継承されていないため、モジュールをインクルードして define_method() を取得することはできません。代わりに、define_method() がメインのシングルトン クラスで定義されている必要があるようです。したがって、これを実装する 1 つの方法は、コードを解析する前に Ruby インタープリターに次のコードを実行させることです。
class <<self
def define_method(x, *y)
#same code as in Module's define method
end
end