具有在ruby中设置的属性的对象的副本

时间:2016-01-01 11:56:04

标签: ruby immutability dup

是否可以在Ruby中返回具有属性集的对象的创建副本?

当然,可以定义一种方法来执行此操作 -

class URI::Generic
  def with_query(new_query)
    ret = self.dup
    ret.query = new_query
    ret
  end
end

但是这可能会对每个属性都有点乏味。

1 个答案:

答案 0 :(得分:2)

您可以使用options hash来传递多个属性 - 值对。这是一个说明性的例子。

class Sample
  attr_accessor :foo, :bar

  def with(**options)
    dup.tap do |copy|
        options.each do |attr, value|
            m = copy.method("#{attr}=") rescue nil
            m.call(value) if m
        end
    end
  end

end


obj1 = Sample.new
#=> #<Sample:0x000000029186e0>
obj2 = obj1.with(foo: "Hello")
#=> #<Sample:0x00000002918550 @foo="Hello">
obj3 = obj2.with(foo: "Hello", bar: "World")
#=> #<Sample:0x00000002918348 @foo="Hello", @bar="World">

# Options hash is optional - can be used to just dup the object as well
obj4 = obj3.with
#=> #<Sample:0x0000000293bf00 @foo="Hello", @bar="World">

PS:关于如何实现选项哈希的variations可能很少,但是,方法的本质或多或少相同。