1
 user = User.find_or_create_by_email 
:name => ENV['ADMIN_NAME'].dup, 
:email => ENV['ADMIN_EMAIL'].dup, 
:password => ENV['ADMIN_PASSWORD'].dup, 
:password_confirmation => ENV['ADMIN_PASSWORD'].dup

这是我的简单种子.rb 的一部分。它由 Rails 作曲家创建。我知道它的作用,但我找不到 .dup 的任何信息。

有什么信息吗?

最好的问候否认

4

2 回答 2

2

.dup是一种 Ruby 方法。它不是特定于 Rails 的。查看Ruby 文档以获取更多信息。

您已经知道.dup在对象上运行会创建该对象的副本。但是,您经常会同时看到.clone.dup调用。根据文档:

一般来说,clone 和 dup 在后代类中可能有不同的语义。虽然 clone 用于复制对象,包括其内部状态,但 dup 通常使用后代对象的类来创建新实例。

它可能超出了你的帖子的范围,但这里有两个例子可以帮助你理解和之间的.dup区别.clone

o = Object.new
def o.foo
  'bar'
end

o.dup.foo   #=> raises NoMethodError
o.clone.foo #=> returns 'bar'


class Foo
  attr_accessor :bar
end
foo = Foo.new
foo.freeze

foo.dup.bar = 'baz'   # returns 'baz'
foo.clone.bar = 'baz' # raises RuntimeError

如您所见,在您的范围内,和seeds.rb之间实际上没有区别(因为您所做的只是对从您的环境全局变量复制的字符串进行查找)。但是,如果您要从这些重复的字符串中运行对象方法,则根据您使用的是还是..dup.clone.dup.clone

于 2013-06-06T07:26:37.720 回答
0

它只是复制对象。

产生 obj 的浅拷贝——拷贝 obj 的实例变量,但不拷贝它们引用的对象。dup 复制 obj 的污染状态。另请参阅 Object#clone 下的讨论。一般来说,clone 和 dup 在后代类中可能有不同的语义。虽然 clone 用于复制对象,包括其内部状态,但 dup 通常使用后代对象的类来创建新实例。

对象#dup → an_object

于 2013-06-06T07:25:47.077 回答