Ruby:向对象添加实例变量

Ruby:向对象添加实例变量,ruby,Ruby,如何将一组实例变量从一个对象添加到另一个对象 例如,想象一下机器人,你有一个基本机器人,你可以用附加组件来定制它 class Robot def initialize @name = "simple robot" @power = nil #no power @speed = nil # more attributes end def add_attributes(addon) @power = addon.pow

如何将一组实例变量从一个对象添加到另一个对象

例如,想象一下机器人,你有一个基本机器人,你可以用附加组件来定制它

class Robot def initialize @name = "simple robot" @power = nil #no power @speed = nil # more attributes end def add_attributes(addon) @power = addon.power @speed = addon.speed #the rest of the attributes that addon has end end 班级机器人 def初始化 @name=“简单机器人” @功率=零#无功率 @速度=零 #更多属性 结束 def add_属性(插件) @电源=加载项电源 @速度=加载项速度 #插件所具有的其余属性 结束 结束 我想重新编写
add_attributes
方法,简单地迭代每个插件的属性,而不是逐个编写,因为可能有几十个属性


有些插件可能有Robot没有的实例变量,我也想将它们添加到Robot中。就像动态创建实例变量一样?

这取决于“属性”的含义;Ruby没有直接的概念,但您可以将实例变量从一个对象复制到另一个对象,例如:

def add_属性(插件)
addon.instance_variables.each do|x|
self.instance\u variable\u set(addon.instance\u variable\u get(x))
结束
结束

[Edit]请注意,也是一个很好的解决方案。

您可以去掉实例变量,改用单个哈希。它的优点是有一个免费的枚举器和一个干净的界面,可以从一个方便的地方访问机器人的所有功能

它还避免了处理实例内部变量的麻烦。它们通常是内部的,用于大量的东西。如果要公开功能,应该使用公共方法。搞乱内部状态至少是一个糟糕的设计,很可能会导致以后的悲伤。一般来说,最好尽可能避免元编程

class Robot
  attr_reader :features

  def initialize
    @features = {}
    @features[:name] = "simple robot"
    @features[:power] = nil #no power
    @features[:speed] = nil
  end

  def add_attributes(addon)
    @features.merge! addon.features
  end
end

您可以使用灵活的gem[0],它允许您在不编写太多代码的情况下动态创建实例变量。 照办


[0]

我真的不喜欢像这样窥视插件的实例变量。一个插件应该提供一种统一的方法来获取它的属性列表,然后可以对它调用该方法。(当然,对于给定的信息,您拥有的可能是最好的解决方案。)使用而不是迭代
addon
参数将清理
add\u attributes
方法。
class SomeClass
  include Flexible
end
sc = SomeClass.new
sc.my_variable_name = 1 # or any other value