0

2 つのオブジェクト間で共有されるパラメーターの配列があります。

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

最初のオブジェクトには、これらのパラメーターが既に設定されています。同じ値を 2 番目のオブジェクトに渡したいと思います。

どうすればいいですか?

私の最初の考えは、使用することでした:

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

「#{attribute}」の中に属性変数を入れてみましたが、それでもうまくいきませんでした。

私は助けを借りずにさまざまな解決策を試しましたが、過去1時間の答えをグーグルで調べても役に立ちませんでした.

一部の結果は、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 に答える