ruby 会自动调用 initialize 方法吗?

编程入门 行业动态 更新时间:2024-10-27 19:18:59
本文介绍了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_dup 和 initialize_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 方法吗?

本文发布于:2023-10-13 14:19:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1488191.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:方法   ruby   initialize

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!