我正在我的程序中设置一些跟踪代码,并想知道哪些方法是通过attr_accessor
定义的。使用TracePoint
,我可以检测到何时调用了attr_accessor
,但我不知道如何让它告诉我它接收到的参数。有什么想法吗?
我正在我的程序中设置一些跟踪代码,并想知道哪些方法是通过attr_accessor
定义的。使用TracePoint
,我可以检测到何时调用了attr_accessor
,但我不知道如何让它告诉我它接收到的参数。有什么想法吗?
module MethodTracer
TracePoint.trace(:c_call) do |t|
if (t.method_id == :attr_accessor)
t.self.extend(MethodTracer)
methods = t.self::Methods ||= []
MethodTracer.send(:define_method, :method_added) {|m| methods << m }
end
end
TracePoint.trace(:c_return) do |t|
if (t.method_id == :attr_accessor)
MethodTracer.send(:remove_method, :method_added)
end
end
end
class Foo
attr_accessor :a, :b
attr_accessor :c
def foo; end
end
Foo::Methods # => [:a, :a=, :b, :b=, :c, :c=]
Methods
常量中,但是您显然可以将它们存储在最方便的地方。在MethodTracer
上定义/删除method_added
确保您不会覆盖您自己定义的任何Foo.method_added
。然而,这种方法需要在调用attr_accessor
之前定义Foo.method_added
,并且您需要在其中调用super
。否则,您将跳过由MethodTracer
定义的临时method_added
。TracePoint
来获取传递给attr_accessor
的方法名称。我发现这几乎是不可能的。 - user513951method(:attr_accessor)
的#parameters告诉我它接收了一些参数(返回[[:rest]]
),但不知道如何获取它,因为它接收了一个传统的splat参数。 - n_x_l你可以使用obj.methods()
来查找实例中所有可用的方法(包括超类中的方法),并使用obj.methods(false)
仅获取当前单例对象上定义的方法。但我不确定是否可能检测这些方法是通过attr_accessor
创建的。
attr_accessor
定义方法和查找实例变量的访问器方法有区别吗? - Wand Maker