new*_*ner 0 ruby module metaprogramming
嘿,我希望我的方法logify将每个方法及其参数以及类A的返回值放入。例如,我编写了一个简单的类A,其中包含两个方法add和sub,并且输出应如下所示:
Output:
Method add(1, 2) called
return value 3
Method sub(1, 2) called
return value -1
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用每种方法,self.instance_methods(false)但是有人可以进一步帮助我吗?
require_relative "log"
class A
extend Log
def add(a, b)
a + b
end
def sub(a, b)
a - b
end
logify
end
a = A.new
a.add(2,1)
a.sub(2,1)
Run Code Online (Sandbox Code Playgroud)
module Log
def logify
puts self.instance_methods(false)
end
end
Run Code Online (Sandbox Code Playgroud)
您可以像这样使用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)
Run Code Online (Sandbox Code Playgroud)
它的作用是在前置模块中定义一个与原始名称相同的方法,然后在中间(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
Run Code Online (Sandbox Code Playgroud)
注意:仅显示提供的参数,不会在方法签名中输出默认参数
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |