`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)
因为你的new
是Mo
实例方法
当你写出这样的代码时
Class Foo
def new
...
end
end
您为带有 class Foo 的对象定义了一个实例方法。但是当你创建一个新实例时,你调用了一个class'方法new
。如果你想重写方法Foo.new
,你应该这样写:
Class Foo
def self.new
....
end
end
但实际上为 classes
声明自己的方法 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)
因为你的new
是Mo
实例方法
当你写出这样的代码时
Class Foo
def new
...
end
end
您为带有 class Foo 的对象定义了一个实例方法。但是当你创建一个新实例时,你调用了一个class'方法new
。如果你想重写方法Foo.new
,你应该这样写:
Class Foo
def self.new
....
end
end
但实际上为 classes
声明自己的方法new
并不是一个好主意