gpt4 book ai didi

ruby - 如何动态创建类的 attr_reader

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

如何在对象上动态创建属性并将对象分配给它的值?我有以下代码:

class Component
def initialize
end
end

class BaseClass
def initialize
end

# define class methods
def self.create_component(**args)
# create attr_accessor with name "ball"
# set ball = Component.new
end
end

class ChildClass < BaseClass

create_component :name => "ball"
create_component :name => "baseball"
def initialize
end
end

我的目标是,当 ChildClass 调用“create_component”方法时,这应该使用 :name 参数中提供的名称创建一个属性,并为该属性实例化一个“Component”对象。

object = ChildClass.new
object.ball #=> to return object reference (Component class 1)
object.baseball #=> to return object reference (Component class 2)

最佳答案

您可以像这样定义 BaseClass:

class Component; end

class BaseClass
@@components = []
def initialize
@@components.each do |attr|
instance_variable_set("@#{attr}", Component.new)
end
end
def self.create_component(name:)
attr_reader name.to_sym
@@components << name
end
end

class ChildClass < BaseClass
create_component :name => "ball"
create_component :name => "baseball"
end

object = ChildClass.new

object.ball
# => #<Component:0x00007fa62fbdf3f8>

object.baseball
# => #<Component:0x00007fa62fbdf3a8>

基本上你要做三件事:

  1. 创建一个类级实例变量@@components,它存储自定义attr_reader 名称的列表
  2. create_component 中,调用 attr_reader 创建方法并将其添加到 @@components 列表中
  3. initialize 中,为每个 @@components 设置初始值(如果你喜欢)。

关于ruby - 如何动态创建类的 attr_reader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54525358/

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