Ruby 上 Rails 节课
Ruby on Rails Classes
RoR 中的 class 是否会在创建 class 的新对象时自动启动第一个方法?
class User
attr_accessor :name, :email
def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end
def formatted_email
"#{@name} <#{@email}>"
end
end
假设我像这样创建一个新用户
connor = User.new(name: "Connor B", email: "CB@example.com")
它怎么知道自动启动第一个方法,而第二个方法只在调用时才起作用?
Ruby 在创建 class 的新对象时自动调用 initialize
方法。
new
调用 initialize
方法。
Reference
不是第一个自动调用的方法,而是new
调用initialize
,这恰好是你看到的大多数代码中的第一个方法。但是,您可以将 initialize
放在 class 定义中的任何位置,并且 new
仍会调用 initialize
方法。
如果没有显式定义 initialize
方法,则会调用默认方法。此外,这是 Ruby 行为, 不是 Ruby 对 Rails 行为,只是为了澄清一下。
这里有一个 related Q&A 可能会对您有所启发。最上面的答案显示了一个示例,该示例更详细地解释了它,并深入探讨了幕后实际发生的事情。
RoR 中的 class 是否会在创建 class 的新对象时自动启动第一个方法?
class User
attr_accessor :name, :email
def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end
def formatted_email
"#{@name} <#{@email}>"
end
end
假设我像这样创建一个新用户
connor = User.new(name: "Connor B", email: "CB@example.com")
它怎么知道自动启动第一个方法,而第二个方法只在调用时才起作用?
Ruby 在创建 class 的新对象时自动调用 initialize
方法。
new
调用 initialize
方法。
Reference
不是第一个自动调用的方法,而是new
调用initialize
,这恰好是你看到的大多数代码中的第一个方法。但是,您可以将 initialize
放在 class 定义中的任何位置,并且 new
仍会调用 initialize
方法。
如果没有显式定义 initialize
方法,则会调用默认方法。此外,这是 Ruby 行为, 不是 Ruby 对 Rails 行为,只是为了澄清一下。
这里有一个 related Q&A 可能会对您有所启发。最上面的答案显示了一个示例,该示例更详细地解释了它,并深入探讨了幕后实际发生的事情。