0

我有一个在两个对象之间共享的参数数组。

attributes = [:name, :category, :value]

第一个对象已经设置了这些参数。我想将这些相同的值传递给第二个对象。

我该怎么做呢?

我最初的想法是使用:

attributes.each do |attribute|
    @object_2.(attribute) = object_1.(attribute)
end

我还尝试将属性变量放在“#{attribute}”中,但它仍然不起作用。

我在没有帮助的情况下尝试了许多不同的解决方案,过去一小时谷歌搜索的答案也没有帮助。

一些结果似乎表明我可以使用 send() 方法完成我正在寻找的东西,但我尝试使用它并没有帮助。

attributes.each do |attribute|
    @object_2.send(attribute) = object_1.send(attribute)
end

如果之前已经回答了这个问题(我无法通过广泛的搜索找到解决方案),请指出我的解决方案。

谢谢。

4

4 回答 4

3
attributes.each do |attribute|
    @object_2.send("#{attribute}=", object_1.send(attribute))
end
于 2013-05-06T07:49:16.467 回答
2

这只是关于如何做到这一点的提示:

class Fred
  def initialize(p1 = nil, p2 = nil)
    @a, @b = p1, p2
  end
  def show
   p [@a,@b]
  end
end

f1 = Fred.new(10,11)
f2 = Fred.new
f1.instance_variables.each do |v|
  f2.instance_variable_set(v,f1.instance_variable_get(v))
end
f2.show #=>[10, 11

如果您只想分配给某些选定的实例变量,而不是全部,您也可以替换f1.instance_variables为。attributes

于 2013-05-06T07:52:48.860 回答
1
@object_2.attributes = object_1.attributes
于 2013-05-06T07:47:54.540 回答
1

假设您已attr_accessor为相应类中的所有属性声明了您的最后一次尝试,您可能已经接近:

attributes.each do |attribute|
    setter = (attribute.to_s + '=').to_sym
    @object_2.send( setter, object_1.send( attribute ) )
end

是可选的.to_sym,我只是喜欢在使用自省时使用符号。

还有一些方法可以做到这一点,而不需要通过暴露的实例变量attr_accessor(不清楚是否需要)

于 2013-05-06T07:49:59.557 回答