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

meg*_*gas 1 ruby

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

class Array
  def flush
    self.dup.tap { self.clear }
  end
end
Run Code Online (Sandbox Code Playgroud)

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

And*_*imm 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
Run Code Online (Sandbox Code Playgroud)

我而言,这个白痴过去了.