Rails 3中的.dup在seeds.rb中的意思是什么

时间:2013-06-06 07:17:51

标签: ruby-on-rails ruby-on-rails-3

 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 composer创建。 我知道它的作用,但我无法找到.dup的任何信息。

有关此的任何信息吗?

最好的问候 denym

2 个答案:

答案 0 :(得分:2)

.dup是一个Ruby方法。它并不特定于Rails。有关详细信息,请查看Ruby docs

您已经知道在对象上运行.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

答案 1 :(得分:0)

它只是复制了对象。

  

生成obj的浅表副本 - obj的实例变量   复制,但不是他们引用的对象。复制污点   对象的状态另请参阅Object#clone下的讨论。一般来说,   clone和dup在后代类中可能有不同的语义。   克隆用于复制对象,包括其内部   state,dup通常使用后代对象的类来创建   新实例。

Object#dup → an_object