2011-12-08 71 views
1

在許多ruby項目中,甚至是紅寶石本身,我都遇到過使用dup的方法。例如,在一些項目中,我見過這樣的結構:爲什麼我們應該使用dup方法?

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

的問題是,爲什麼我們應該使用DUP方法,即創建對象的副本,而不是僅僅使用相同的對象?謝謝

回答

7

使用DUP或者代碼庫的一部分,是由一個白癡,不知道你不應該修改的對象,如果你能幫助它(相反,你應該創建一個新的對象)編寫的克隆:

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

您可能會在代碼中以某種方法更改對象。爲了在這個特定的方法後保持對象不變,你應該在做任何事之前複製對象。

另一個原因是製作一個對象的副本(是的,這非常合理)。例如,您可以複製想象中的類Project的某個對象以將其分叉爲新的獨立項目。

相關問題