私は、次のように見えるこの質問のために選択されたソリューションから多かれ少なかれ持ち上げられたアスペクトっぽいコードを書いています:
class Module
def add_logging klass, *method_names
method_names.each do |method_name|
original_method = instance_method method_name
define_method method_name do |*args, &blk|
log.debug("#{klass}.#{method_name} called")
original_method.bind(klass).call(*args, &blk)
end
end
end
end
他の投稿のソリューションはklassパラメーターを必要としませんが、インスタンスメソッドに対してのみ機能しますが、コードを次のように呼び出したいと思います。
module MyModule
def MyModule.module_method
p "hello"
end
class << self
add_logging self, :module_method1
end
end
残念ながら、このコードを実行すると、が表示されますin 'bind': singleton method called for a different object (TypeError)
。self
ブロックのコンテキストを渡すclass << self
と、上記のコードのbind呼び出しが、まったく同じメタクラスにバインドされていないと見なす理由がわかりません。