Вы можете использовать Module#prepend
и Module#prepended
, чтобы помочь с этим следующим образом:
module Log
def self.prepended(base)
base.instance_methods(false).each do |m|
define_method(m) do |*args, &block|
puts "Method #{m}(#{args.join(',')}) called"
val = super(*args, &block)
puts "return value #{val}"
val
end
end
end
end
class A
def add(a, b)
a + b
end
def sub(a, b)
a - b
end
end
A.prepend(Log)
Что он делает, так это определяет метод в предварительно добавленном модуле с тем же именем, что и у оригинала, затем строит выходные данные и выполняет исходный метод в середине (super
) для получения возвращаемого значения.
Примеры
a = A.new
a.add(2,1)
# Method add(2,1) called
# return value 3
#=> 3
a.sub(2,1)
# Method sub(2,1) called
# return value 1
#=> 1
Предупреждение: это будет показывать только предоставленные аргументы и не будет выводить аргументы по умолчанию в сигнатуре метода