`initialize` 似乎检查给 `new` 的参数

`initialize` seems to check the arguments given to `new`

我正在查看这段代码:

class Mo
  def new(indy, rome = 1)
    initialize(indy, rome)
  end
  def initialize(indy, rome)
    ...
  end
end

Mo.new(2)

我得到这个输出:

test.rb:6:in `initialize': wrong number of arguments (1 for 2)   (ArgumentError)

如果我在定义中将 rome 的默认值添加到 new,它会起作用:

class Mo
  def new(indy, rome = 1)
    initialize(indy, rome)
  end
  def initialize(indy, rome = 1)
    ...
  end
end

Mo.new(2)

为什么?

因为 Mo.new(2) 调用方法 Mo.new,它默认调用方法 Mo#initialize 并使用它收到的单个参数 2,但是你的 Mo#initialize 需要两个参数。

不需要new方法,因为initialize是"middleware"用于分配(创建)ruby对象

class Mo
  def initialize(indy, rome = 1)
    @indy = indy
    @rome = rome
  end
end
i = Mo.new(2)

这意味着ruby不进入new方法

您可以通过以下方式查看:

puts Mo.method(:new).source_location
# => nil

但您可以在 Mo class

中覆盖 self.new
def self.new(indy, rome = 1)
end

然后

p Mo.method(:new).source_location
# =>["mo.rb", 2]

并且它不进入 initialize 方法 then

P.S。 这不是好的做法,但如果你想执行你的代码,你应该调用

Mo.new(2).new(3)

因为你的newMo实例方法

当你写出这样的代码时

Class Foo
  def new
    ...
  end
end

您为带有 class Foo 的对象定义了一个实例方法。但是当你创建一个新实例时,你调用了一个class'方法new。如果你想重写方法Foo.new,你应该这样写:

Class Foo
  def self.new
    ....
  end
end

但实际上为 classes

声明自己的方法 new 并不是一个好主意