gpt4 book ai didi

ruby - 获取通过 `attr_accessor` 定义的所有变量而不覆盖 `attr_accessor`

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:16 25 4
gpt4 key购买 nike

我正在我的程序中设置一些跟踪代码,想知道哪些方法是通过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

关于ruby - 获取通过 `attr_accessor` 定义的所有变量而不覆盖 `attr_accessor`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34439116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com