我有一个在两个对象之间共享的参数数组。
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
如果之前已经回答过这个问题(我无法通过广泛的搜索找到解决方案),请指出我的解决方案。
感谢。
答案 0 :(得分:3)
attributes.each do |attribute|
@object_2.send("#{attribute}=", object_1.send(attribute))
end
答案 1 :(得分: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
。
答案 2 :(得分:1)
@object_2.attributes = object_1.attributes
答案 3 :(得分: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
公开实例变量(不清楚你是否需要它)