为什么我们定义 `#initialize` 而不是 `::new`

2024-01-08

在 Ruby 中,当创建一个新类时,我们将像这样定义构造函数方法:

class Thing
  def initialize
     do_stuff
  end
end

然而,当实际创建对象的实例时,我们发现自己没有调用initialize在实例上但是new在课堂上。

既然如此,我们为什么不定义::new?

class Thing
   def self.new
     do_stuff
   end
end

有什么东西吗::new在幕后做的initalize没有定义?这两者有什么不同吗?将定义::new工作?或者只是这样def initialize短于(不)于def self.new?

我认为造成这种差异一定是有充分理由的。


New 为新对象分配空间并创建它。然后它调用对象初始化方法以使用分配的内存创建一个新对象。通常,您想要自定义的唯一部分是实际创建,并且很乐意将后面的内存分配留给 Object.new 方法,因此您编写了一个初始化方法。 new 在底层所做的事情看起来像这样(C 语言除外):

 class Object
    def self.new(*args, &block)
        object = allocate
        object.send(:initialize, *args, &block)
        return object
    end
 end

因此,当您调用 Object.new 时,实际发生的情况是:

1)分配内存 2) 调用对象的初始化方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们定义 `#initialize` 而不是 `::new` 的相关文章

随机推荐