2013-05-06 53 views
0

我有两个对象之间共享的参数数组。如何使用对象参数数组来设置值

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

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

我该怎么做?

我最初的想法是使用:

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

我也试图把属性变量“#{属性冲”里面,但它仍然没有奏效。

我已经尝试了许多不同的解决方案,没有任何帮助,并且在过去的一个小时内用谷歌搜索答案没有帮助。

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

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

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

谢谢。

回答

3
attributes.each do |attribute| 
    @object_2.send("#{attribute}=", object_1.send(attribute)) 
end 
+1

看起来像它的工作,谢谢。 – Kirk 2013-05-06 07:54:53

1
@object_2.attributes = object_1.attributes 
1

你可能在你的最后一次尝试接近,假设你已经宣布attr_accessor在各自的类中的所有属性(ES):

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

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

也有办法做到这一点,而无需通过attr_accessor暴露的实例变量(目前还不清楚是否需要一个)

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 

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

相关问题