为什么我们应该使用dup方法?

时间:2011-12-08 02:21:57

标签: ruby

在许多ruby项目中甚至ruby本身我都遇到过使用 dup 方法。例如,在某些项目中,我遇到了这种结构:

class Array
  def flush
    self.dup.tap { self.clear }
  end
end

问题是为什么我们应该使用 dup 方法,即创建对象的副本而不是仅使用相同的对象?谢谢

2 个答案:

答案 0 :(得分:7)

如果代码库的一部分是由一个不知道你不应该修改对象的白痴写的,那么使用dup或clone;相反,你应该创建一个新对象:

class Greeter

  def initialize
    @greeting_cache = {}
  end

  def expensive_greeting_calculation(formality)
    case formality
      when :casual then "Hi"
      when :formal then "Hello"
    end
  end

  def greeting(formality)
    unless @greeting_cache.has_key?(formality)
      @greeting_cache[formality] = expensive_greeting_calculation(formality)
    end
    @greeting_cache[formality]
  end

end

def memoization_mutator
  greeter = Greeter.new
  first_person = "Bob"
  # Mildly contrived in this case,
  # but you could encounter this in more complex scenarios
  puts(greeter.greeting(:casual) << " " << first_person) # => Hi Bob
  second_person = "Sue"
  puts(greeter.greeting(:casual) << " " << second_person) # => Hi Bob Sue
end

memoization_mutator

my case中,这个白痴过去了。

答案 1 :(得分:1)

您可以在代码中的某些方法中更改对象。为了在此特定方法之后保持对象不变,您应该在对对象执行任何操作之前复制该对象。

另一个原因就是制作一个对象的副本(是的,这很合乎逻辑)。例如,您可以复制虚构类Project的某个对象,将其转换为新的独立项目。