【发布时间】:2011-12-08 02:21:56
【问题描述】:
在许多 ruby 项目甚至 ruby 本身中,我都遇到了 dup 方法的使用。例如,在一些项目中我遇到过这样的构造:
class Array
def flush
self.dup.tap { self.clear }
end
end
问题是为什么我们应该使用 dup 方法,即创建对象的副本而不是只使用同一个对象?谢谢
【问题讨论】:
标签: ruby
在许多 ruby 项目甚至 ruby 本身中,我都遇到了 dup 方法的使用。例如,在一些项目中我遇到过这样的构造:
class Array
def flush
self.dup.tap { self.clear }
end
end
问题是为什么我们应该使用 dup 方法,即创建对象的副本而不是只使用同一个对象?谢谢
【问题讨论】:
标签: ruby
如果代码库的一部分是由一个不知道您不应该修改对象的白痴编写的,请使用 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,白痴已经过去了。
【讨论】:
您可以在代码中的某些方法中更改对象。要在此特定方法之后保持对象不变,您应该在对其进行任何操作之前复制该对象。
另一个原因只是复制一个对象(是的,这很合乎逻辑)。例如,您可以复制虚构类 Project 的某个对象,以将其分叉成一个新的独立项目。
【讨论】: