我有一个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
我需要帮助将复制的对象与新参数混合。
答案 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