【问题标题】:Why we should use dup method?为什么要使用 dup 方法?
【发布时间】:2011-12-08 02:21:56
【问题描述】:

在许多 ruby​​ 项目甚至 ruby​​ 本身中,我都遇到了 dup 方法的使用。例如,在一些项目中我遇到过这样的构造:

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

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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    如果代码库的一部分是由一个不知道您不应该修改对象的白痴编写的,请使用 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,白痴已经过去了。

    【讨论】:

      【解决方案2】:

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

      另一个原因只是复制一个对象(是的,这很合乎逻辑)。例如,您可以复制虚构类 Project 的某个对象,以将其分叉成一个新的独立项目。

      【讨论】:

        猜你喜欢
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        相关资源
        最近更新 更多