【发布时间】:2021-07-22 12:58:56
【问题描述】:
我正在尝试找出一种基于父类动态生成子类的方法。在我的特定情况下,我希望每个实例变量都有 attr_accessor,在我的 Parent 类中初始化并在 SubClasses 上继承。 我的类是三个不同的模型,代表数据库中的三个不同表。
“记录”是我想要存储和编写所有代码的父类。 “Post”和“User”是继承的子类。
我的代码
class Record
attr_reader :id
# attr_accessor
def initialize(**params)
@id = params[:id]
instance_variable_set("@#{params.keys[0]}", params.values[0])
instance_variable_set("@#{params.keys[1]}", params.values[1])
instance_variable_set(:@votes, params["votes"] || 0) if instance_of?(Post)
# p self.title
end
我想要实现的是设置 attr_accessor,例如在我要调用的子类“Post”中
post = Post.new(title: "New post", url: "some url")
puts post.title
我可以在不引发 NoMethodError 的情况下访问 title 实例变量
有人可以指导我,或者给我一些提示吗? 谢谢
【问题讨论】:
-
我有点困惑。您是否只想接受通过
Hash发送的任何内容并为此创建方法,例如Post.new(title: "New post", url: "some url", left_hand_monkey_wrench: true)是一个有效的Post对象,您可以调用post.left_hand_monkey_wrench #=> true吗?如果这是您的目标,那么实现可以相当简单,如果不是,请更清楚地解释您的愿望。 -
@engineersmnky 是的,这正是我想要实现的目标!
-
@engineersmnky 能否请您分享一个提示或帮助我?真的很感激
-
为什么要将所有代码都放入 Record 中?像
instance_variable_set(:@votes, params["votes"] || 0) if instance_of?(Post)这样从父类引用子类只是各种错误。如果Post有一个特定的属性,它应该定义它而不是把所有东西都放到一个上帝类中。 -
我知道你在说什么,但它更像是一种“风格练习”。我是 ruby 和编程的新手,实际上我正在尝试学习新的东西,所以在这个特定的案例中,这是一个针对这个问题的抽象练习
标签: ruby metaprogramming