Jör*_*tag 22
不,Ruby不会initialize自动调用.
Class#new看起来有点像这样的默认实现:
class Class
def new(*args, &block)
obj = allocate
obj.initialize(*args, &block)
obj
end
end
Run Code Online (Sandbox Code Playgroud)
[其实initialize是private在默认情况下,所以你需要使用obj.send(:initialize, *args, &block).]
因此,默认的实现Class#new 不叫initialize,但它是完全有可能(尽管愚蠢至极)覆盖或用未实现覆盖.
所以,调用它不是Rubyinitialize,而是Class#new.你可能认为这是分裂的头发,因为它Class#new是Ruby不可或缺的一部分,但重要的是:它不是某种语言魔法.这是一个像任何其他方法一样的方法,就像任何其他方法一样,它可以被覆盖或覆盖以完成不同的操作.
当然,如果你不是new用来创建一个对象而是用手工创建它allocate,那么initialize也不会被调用.
这里有一些情况下,无需调用创建对象initialize.例如,当dup荷兰国际集团或cloneING,initialize_dup和initialize_clone被调用,而不是initialize(这两者,反过来,呼叫initialize_copy).并且,当通过比较反序列化对象时Marshal,其内部状态被直接重建(即实例变量被反射地设置)而不是通过initialize.
| 归档时间: |
|
| 查看次数: |
10544 次 |
| 最近记录: |