Iが印刷後、クラスにそのインスタンスメソッドと同じ名前のクラスのインスタンスメソッドを呼び出すsuper
を使用して動的に作成された匿名のモジュールを付加するように傾斜されますmethod-entryメッセージを出力し、method-exitメッセージを出力します。
最初に2つのインスタンスメソッドを持つクラスを作成します.1つはインボーク時にブロックを渡します。
ここで、匿名モジュールを作成し、それをクラスの先頭に追加するメソッドを作成します。
def loggem(klass, *methods_to_log)
log_mod = Module.new do
code = methods_to_log.each_with_object('') { |m,str| str <<
"def #{m}(*args); puts \"entering #{m}\"; super; puts \"leaving #{m}\"; end\n" }
class_eval code
end
klass.prepend(log_mod)
end
現在ログインされるモジュールが付加されるべきクラスに等しい、引数、そのクラスのインスタンスメソッドでこのメソッドを呼び出す準備ができています。
loggem(C, :mouse, :hubbard)
C.ancestors
#=> [#<Module:0x007fedab9ccf48>, C, Object, Kernel, BasicObject]
c = C.new
c.method(:mouse).owner
#=> #<Module:0x007fedab9ccf48>
c.method(:mouse).super_method
#=> #<Method: Object(C)#mouse>
c.method(:hubbard).owner
#=> #<Module:0x007fedab9ccf48>
c.method(:hubbard).super_method
#=> #<Method: Object(C)#hubbard>
c.mouse(3, 'blind')
# entering mouse
# 3 blind mice
# leaving mouse
c.hubbard('old', 'mother', 'hubbard') { |a| a.map(&:upcase).join(' ') }
# entering hubbard
# OLD MOTHER HUBBARD
#leaving hubbard
はModule::newとModule#prependを参照してください。
私が必要としていたもの。どうも – amadain