gpt4 book ai didi

ruby - 在常量中继承 attr_accessor

转载 作者:数据小太阳 更新时间:2023-10-29 08:30:27 24 4
gpt4 key购买 nike

我有一个 attr_accessor 设置如下的类:

class Human
ATTRIBUTES = [:name]
attr_accessor *ATTRIBUTES
end

它就像一个魅力,让我保持 ATTRIBUTES 内的属性不变。问题是我想让一个 Student 类继承自 Human 类,而不需要每次都放置 attr_accessor。基本上我想要的是:

class Student < Human
ATTRIBUTES = [:name, :school]
end

不幸的是当我这样做的时候

Student.new.school

我没有收到任何方法错误,因为 attr_accessor 是从 Human 而不是 Student 加载的。我应该使用什么结构来实现我的目标?

最佳答案

我个人同意@lcguida 的回答,但如果您坚持遵循您提出的模式,我想出了一个小实验。其他答案已经涵盖了您的解决方案为何不起作用的原因,因此我不在此赘述。

首先想到的是在父类的self.inherited 回调中调用attr_accessor,但不幸的是 child 的 body 直到后来才加载。即便如此,有志者事竟成。如果您使用的是 Ruby 2.0 或更高版本,则可以使用以下实现。

module LazyAttrAccessorizer
def self.extended(obj)
TracePoint.trace(:end) do |t|
if obj == t.self
obj.send :attr_accessor, *obj::ATTRIBUTES
t.disable
end
end
end
end

class Human
extend LazyAttrAccessorizer
ATTRIBUTES = [:name]
def self.inherited(subclass)
subclass.extend LazyAttrAccessorizer
end
end

class Student < Human
ATTRIBUTES = [:name, :school]
# ATTRIBUTES = [:school] would also work as expected, but I think you'd like to be literal there.
end

> Student.new.respond_to?(:name)
=> true
> Student.new.respond_to?(:school)
=> true

关于ruby - 在常量中继承 attr_accessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39793481/

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