4

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

例如,想象一下您拥有基础机器人的机器人,您可以使用附加组件对其进行自定义。

类机器人

   定义初始化
      @name = "简单机器人"
      @power = nil #没有电源
      @速度 = 无
      # 更多属性
   结尾

   def add_attributes(插件)
      @power = addon.power
      @speed = addon.speed
      #插件具有的其余属性
   结尾
结尾

我想重写add_attributes方法来简单地迭代每个插件的属性,而不是一个一个地写它们,因为可能有几十个属性。

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

4

3 回答 3

8

这取决于您所说的“属性”是什么意思;Ruby 没有直接的概念,但您可以将实例变量从一个对象复制到另一个对象,如下所示:

def add_attributes(addon)
  addon.instance_variables.each do |x|
    self.instance_variable_set(addon.instance_variable_get(x))
  end      
end

[编辑]请注意,@HolgerJust 的回答也是一个很好的解决方案。

于 2012-05-09T23:21:33.460 回答
6

您可以摆脱实例变量并改用单个哈希。这具有免费枚举器和干净界面的优势,可以从一个方便的地方访问机器人的所有功能。

它还避免了弄乱实例内部变量。它们通常是内部的,用于大量的东西。如果要公开功能,则应使用公共方法。弄乱内部状态至少是糟糕的设计,并且很可能会在以后导致很多悲伤。通常,最好尽可能避免元编程。

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
于 2012-05-09T23:25:56.147 回答
0

您可以使用灵活的 gem[0],它可以让您在不编写太多代码的情况下即时创建实例变量。做就是了

class SomeClass
  include Flexible
end
sc = SomeClass.new
sc.my_variable_name = 1 # or any other value

[0] https://github.com/matthiasbeyer/flexible

于 2012-05-13T15:12:07.057 回答