ruby 会自动调用 initialize 方法吗? [英] Does ruby call initialize method automatically?

查看:49
本文介绍了ruby 会自动调用 initialize 方法吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果类定义中包含初始化方法,我是否需要显式初始化对象?

Do I need to explicitly initialize an object if an initialize method is included in class definition?

推荐答案

不,Ruby 不会自动调用 initialize.

No, Ruby does not call initialize automatically.

Class#new 的默认实现看起来有点像这样:

The default implementation of Class#new looks a bit like this:

class Class
  def new(*args, &block)
    obj = allocate
    obj.initialize(*args, &block)
    obj
  end
end

[实际上,initialize默认是private,所以你需要使用obj.send(:initialize, *args, &block).]

[Actually, initialize is private by default so you need to use obj.send(:initialize, *args, &block).]

因此,Class#new 确实调用 initialize 的默认实现,但是完全有可能(尽管非常愚蠢)覆盖或者用一个没有实现的实现覆盖它.

So, the default implementation of Class#new does call initialize, but it would be perfectly possible (albeit extremely stupid) to override or overwrite it with an implementation that does not.

所以,调用initialize 的不是Ruby,而是Class#new.您可能认为这令人毛骨悚然,因为 Class#new 是 Ruby 不可或缺的一部分,但这里重要的是:它不是某种语言魔法.这是一种与任何其他方法一样的方法,并且与任何其他方法一样,它可以被覆盖或覆盖以执行完全不同的操作.

So, it's not Ruby that calls initialize, it's Class#new. You may think that's splitting hairs, because Class#new is an integral part of Ruby, but the important thing here is: it's not some kind of language magic. It's a method like any other, and like any other method it can be overridden or overwritten to do something completely different.

当然,如果您不使用 new 创建对象而是使用 allocate 手动创建,则 initialize也不会被调用.

And, of course, if you don't use new to create an object but instead do it manually with allocate, then initialize wouldn't be called either.

在某些情况下,对象是在不调用 initialize 的情况下创建的.例如.当 duping 或 cloneing 时,initialize_dupinitialize_clone 被调用而不是 initialize(两者依次调用 initialize_copy).当通过 Marshal 反序列化一个对象时,它的内部状态是直接重构的(即实例变量被反射设置),而不是通过 initialize.

There are some cases where objects are created without calling initialize. E.g. when duping or cloneing, initialize_dup and initialize_clone are called instead of initialize (both of which, in turn, call initialize_copy). And when deserializing an object via, say, Marshal, its internal state is reconstructed directly (i.e. the instance variables are set reflectively) instead of through initialize.

这篇关于ruby 会自动调用 initialize 方法吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆