rails中的initialize方法有什么作用

jas*_*328 27 attributes ruby-on-rails ruby-on-rails-3

我试图围绕使用initialize方法的目的.在Hartl的教程中,他使用了这个例子.

def initialize(attributes = {})
   @name = attributes[:name]
   @email = attributes[:email]
end
Run Code Online (Sandbox Code Playgroud)

是初始化设置实例变量@name@email属性,如果是,为什么我们有参数attributes = {}

Mic*_*ins 37

Ruby使用该initialize方法作为对象的构造函数.它是Ruby语言的一部分,不是Rails框架特有的.当您实例化新对象时调用它,例如:

@person = Person.new
Run Code Online (Sandbox Code Playgroud)

调用new类级方法会Class分配该类的类型,然后调用该对象的initialize方法:

http://www.ruby-doc.org/core-1.9.3/Class.html#method-i-new

所有对象都有一个默认initialize方法,它不接受任何参数(你不需要写一个 - 你自动获得它).如果您希望对象在initialize方法中执行不同的操作,则需要定义自己的版本.

在你的榜样,你是传递一个哈希到initialize可以用来设置默认值的方法@name@email.

你使用如下:

@person = Person.new({name: 'John Appleseed', email: 'john@some.net'})
Run Code Online (Sandbox Code Playgroud)

初始化程序具有属性attributes = {}的默认值(将默认值设置为ampty hash - {})的原因是,您也可以在不必传递参数的情况下调用它.如果你不"指定参数,那么attributes将是一个空的哈希,因此双方@name@emailnil作为存在这些键(无值值:name:email).

  • 更多要点:使用`initialize`的机制实际上是Ruby而不是Rails.传递空哈希作为属性的默认值(`attributes = {}`)将在尝试访问未在哈希`attributes [:name] #nil`上设置的键时优雅地返回nil - 如果没有默认值设置(如`initialize(attributes)`访问方法中的属性会抛出错误`attributes [:something] #error`. (4认同)