2016-11-08 1 views
1

でオブジェクトを複製Rubyは私がRubyのオブジェクトを持っている修正のparams

def initialize(args={}) 
    @name = args[:name] 
    ... 
end 

my_cat = Cat.new(name: 'Mittenz', age: 3, type: 'cheshire') 

を言って、私は別のオブジェクト内ではなく入力するオプション異なるパラメータでそれを複製する必要があり、このようなsomehting:

Class CatCopyist 
    def initialize(args={}) 
    @my_cat = args[:cat] # my_cat object from above passed here 
    end 

    def copy_cat 
    another_cat = @my_cat.dup.merge(type: 'siamese') 
    return another_cat 
    end 
    ... 
end 

コピーしたオブジェクトを新しいパラメータとブレンドする際に助けが必要です。

+0

「@ my_cat」とは何ですか?実際の作業コード(複写部分以外)を掲載することはできますか? – Max

+0

これはタイプミスです。修正されました。ワーキングコードは、変数名を除いて全く同じに見えます。 –

答えて

1

カスタム動作を定義するためにDUPメソッドをオーバーライドすることができます。

class Cat 
    attr_reader :name, :type, :age 
    def initialize(args={}) 
    @name = args[:name] 
    @age = args[:age] 
    @type = args[:type] 
    end 

    def to_s 
    "#{name} (#{type} - #{age})" 
    end 

    def dup(args={}) 
    new_cat = super() 
    args.each do|var, value| 
     new_cat.instance_variable_set(:"@#{var}", value) 
    end 
    new_cat 
    end 
end 
mittenz = Cat.new(name: 'Mittenz', age: 3, type: 'cheshire') 

puts mittenz 
puts mittenz.dup(type: 'siamese') 
#=> Mittenz (cheshire - 3) 
# Mittenz (siamese - 3) 
+0

を使用して問題を解決するように見えるので、この回答に感謝します。 –

+0

':'は不要です。 'instance_variable_set'は文字列またはシンボルを受け入れます。 – Max

+0

どちらも正常に動作します。ドキュメントから: "インスタンス変数名が文字列として渡された場合、その文字列はシンボルに変換されます。"私はシンボルを直接送るかもしれません。 –

0

あなたが古い変数を上書きするObject#instance_variable_setを使用することができます

def dup(args = {}) 
    d = super() 
    args.each do |k, v| 
    d.send(:"#{k}=", v) 
    end 
    d 
end 
+0

セッターが定義されているかどうかは確かではありませんか? –

+0

setterが定義されていない場合は、 'd.instance_variable_set(" @#{k} "、v)' –

関連する問題