Ruby类实例方法def初始化:实例或类方法?

时间:2016-10-25 19:08:14

标签: ruby

让我们选择正常的红宝石课程:

class Person
  attr_accessor :name
  def initialize name
    @name = name
  end
end

bob = Person.new("bob")

我的问题是初始化的本质。这就是问题,new显然是一个类方法,但在我看来initialize是一个实例方法(不是类),在类方法new创建的实例上调用调用。

我有这个权利吗?或者有人会有新的亮点吗?我做了一些谷歌搜索,找不到任何清晰度。

1 个答案:

答案 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