如何使用对象参数数组来设置值

时间:2013-05-06 07:43:40

标签: ruby-on-rails ruby

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

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 个答案:

答案 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公开实例变量(不清楚你是否需要它)