Ruby使用修改的参数复制对象

时间:2016-11-08 14:08:12

标签: ruby

我有一个ruby对象说

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

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

我需要在另一个对象中复制它,但是可以选择输入不同的参数,有点像这样:

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

我需要帮助将复制的对象与新参数混合。

2 个答案:

答案 0 :(得分:1)

您可以使用Object#instance_variable_set覆盖旧变量。

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)

答案 1 :(得分:0)

您可以覆盖dup方法来定义自定义行为

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