让我们选择正常的红宝石课程:
class Person
attr_accessor :name
def initialize name
@name = name
end
end
bob = Person.new("bob")
我的问题是初始化的本质。这就是问题,new
显然是一个类方法,但在我看来initialize
是一个实例方法(不是类),在类方法new
创建的实例上调用调用。
我有这个权利吗?或者有人会有新的亮点吗?我做了一些谷歌搜索,找不到任何清晰度。
答案 0 :(得分:6)
当一个新对象被初始化时(也就是说,当你在类上调用new
时)这个方法有效地被调用:
class Class
def new(*args, &block)
obj = allocate
obj.send(:initialize, *args, &block)
obj
end
end
在标准的Ruby实现中,此方法在C中实现,但是well documented。
要了解这里发生了什么,你必须要知道在Ruby中,甚至类都是对象(它们是实例或Class
类)。因此,在new
类上调用Person
时,实际上是在new
对象的实例上调用Class
方法。
如您所见,Person
类(作为Class
本身的实例)带来了一种为名为bob
的新实例分配内存的方法。分配内存后,new
方法会在新创建的实例上调用initialize
。