【发布时间】:2020-09-08 11:55:19
【问题描述】:
我正在尝试编写一个模块,无论其内容如何,它都可以用于每个类:
该模块应执行以下操作:
-
每当调用方法时打印名称方法及其参数。
-
打印该方法的返回值。
举个例子:
class A
extend Loginator
def add(a, b)
a + b
end
def sub(a, b)
a - b
end
logify_me #this where the "logging happens!"
end
a = A.new
a.add(3, 5)
a.sub(7, 4)
输出
Methode add(3, 5) called
returns 8
Methode sub(7, 4) called
returns 3
我不知道从哪里开始。 我已经阅读了以下链接:
所以我做了以下但我有点卡住了:
第一次尝试
module Loginator
def logify_me(name)
attr_reader name
define_method("#{name}=") do |val|
puts "#{name}=#{val}"
instance_variable_set("@#{name}", val)
end
end
end
class Example
extend Loginator
logify_me :an_attribute
end
e = Example.new
e.an_attribute = 12
p e.an_attribute
此代码的问题是,首先我必须为每个方法严格编写logify_me,如果我单独编写logify_me,则不会打印任何内容
第二次尝试
module Loginator
def logify_me
self.instance_methods.each do |method|
define_method(method) do |*args|
puts "Method #{method}(#{args.join(', ')})"
puts "returns #{args}"
args#problem this return the args not the results of each method?!
end
end
end
end
请注意,我可以使用TracePoint.trace(:call),但这不是我们想要的:)。
感谢用户@pedrosfdcarneiro 指出包装模块 解决方案并提供此ref
【问题讨论】:
-
欢迎来到 SO。你的问题问得不好。您向我们提出了要求,但没有向我们展示自己解决问题的任何尝试。 SO 不是代码编写服务,我们帮助您调试您编写的代码。请参阅“How to Ask”、“Stack Overflow question checklist”和“MCVE”及其所有链接页面。
-
@theTinMan 添加了我目前所在的位置。因此,如果您打算提供帮助,这是正确的时间:)