2013-05-06 50 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

相關問題