在許多ruby項目中,甚至是紅寶石本身,我都遇到過使用dup的方法。例如,在一些項目中,我見過這樣的結構:爲什麼我們應該使用dup方法?
class Array
def flush
self.dup.tap { self.clear }
end
end
的問題是,爲什麼我們應該使用DUP方法,即創建對象的副本,而不是僅僅使用相同的對象?謝謝
在許多ruby項目中,甚至是紅寶石本身,我都遇到過使用dup的方法。例如,在一些項目中,我見過這樣的結構:爲什麼我們應該使用dup方法?
class Array
def flush
self.dup.tap { self.clear }
end
end
的問題是,爲什麼我們應該使用DUP方法,即創建對象的副本,而不是僅僅使用相同的對象?謝謝
使用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,白癡已經過去了。
您可能會在代碼中以某種方法更改對象。爲了在這個特定的方法後保持對象不變,你應該在做任何事之前複製對象。
另一個原因是製作一個對象的副本(是的,這非常合理)。例如,您可以複製想象中的類Project的某個對象以將其分叉爲新的獨立項目。