gpt4 book ai didi

ruby - 我可以在检查时获得传递给类中的 attr_accessor 的符号列表吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:06 26 4
gpt4 key购买 nike

假设我定义了一个类,其访问器使用 attr_accessor 定义:

class A
attr_accessor :alpha, :beta, :gamma

def initialize
self.alpha = 1
end
end

是否有内置方法给出传递给 attr_accessor 调用的方法名称列表?或者我是否必须用符号定义一个常量,并将其传递给 attr_accessor

最佳答案

没有内置方法。在创建时存储方法名称的解决方案将起作用,只要您事先知道并且可以控制方法名称是什么。

在我对 a different but similar question 的回答中,我展示了如何使用 TracePoint 动态获取方法的名称。我在下面更新了它以包括 :attr_reader:attr_writer

module MethodTracer
TracePoint.trace(:c_call) do |t|
if %i[attr_accessor attr_writer attr_reader].include?(t.method_id)
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 %i[attr_accessor attr_writer attr_reader].include?(t.method_id)
MethodTracer.send(:remove_method, :method_added)
end
end
end

class Foo
attr_accessor :a
attr_reader :b
attr_writer :c

def foo; end
end

Foo::Methods # => [:a, :a=, :b, :c=]

我已将方法名称存储在 Methods 常量中,但显然您可以将它们存储在最方便的位置。

MethodTracer 上定义/删除 method_added 可确保您不会破坏您自己定义的任何 Foo.method_added。但是,这种方法确实需要,如果您在调用 attr_* 之前定义了 Foo.method_added,则需要在其中调用 super .否则,您将跳过 MethodTracer 定义的临时 method_added

关于ruby - 我可以在检查时获得传递给类中的 attr_accessor 的符号列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25345127/

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