Ruby 构造方法:new 还是 initialize?

负责使对象生成的方法称为构造方法。在 Ruby 中,构造方法称为 newnew 方法是一个类方法,一旦创建了一个对象,如果名为 initialize 的实例方法存在的话,就会运行它。

简而言之,new 方法是构造方法,并使用 initialize 方法在创建对象后立即初始化任意变量的值。但是为什么你不能编写自己的 new 方法并在其中初始化变量?让我们尝试一下:

new.rb
  1. class MyClass
  2. def initialize(aStr)
  3. @avar = aStr
  4. end
  5. def MyClass.new(aStr)
  6. super
  7. @anewvar = aStr.swapcase
  8. end
  9. end
  10. ob = MyClass.new("hello world")
  11. puts(ob)
  12. puts(ob.class)

在这里,我使用 super 关键字调用默认的 new 构造方法,超类的 new 方法。然后我创建了一个字符串实例变量 @anewvar。那么我最终会得到什么呢?正如你可能想的那样,不是包含几个字符串变量的新 MyClass 对象。请记住,Ruby 中的方法计算的最后一个表达式是该方法返回的值。这里 new 方法计算的最后一个表达式是一个字符串。所以,当我计算这…

  1. ob = MyClass.new("hello world")

MyClass.new 返回一个字符串;并且它是这个被分配给 ob 的字符串(不是 MyClass 对象)。因为你不太可能想要做这样的事情,所以通常明智的做法是避免尝试覆盖(override)new 方法。