Ruby `initialize`似乎要检查给定给`new'的参数`
我正在查看以下代码:Ruby `initialize`似乎要检查给定给`new'的参数`,ruby,new-operator,initializer,Ruby,New Operator,Initializer,我正在查看以下代码: 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的默认值添加到ne
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
,默认情况下,该方法使用收到的单个参数2
调用方法Mo.initialize
,但是您的Mo.initialize
需要两个参数。因为Mo.new(2)
调用方法Mo.new,默认情况下,它使用它接收到的单个参数2
调用方法Mo#initialize
,但是您的Mo#initialize
需要两个参数。不需要新的
方法,因为initialize
是分配(创建)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
类中覆盖self.new
def self.new(indy, rome = 1)
end
然后
然后它不会进入初始化方法
附言。
这不是一个好的实践,但是如果您想执行代码,应该调用
Mo.new(2).new(3)
因为您的new
是Mo
实例方法不需要new
方法,因为initialize
是分配(创建)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
类中覆盖self.new
def self.new(indy, rome = 1)
end
然后
然后它不会进入初始化方法
附言。
这不是一个好的实践,但是如果您想执行代码,应该调用
Mo.new(2).new(3)
因为当您编写这样的代码时,new
是Mo
实例方法
Class Foo
def new
...
end
end
使用类Foo为对象定义实例方法。但是当你创建一个新实例时,你调用一个类的方法new
。如果您想重写方法Foo.new
,您应该这样写:
Class Foo
def self.new
....
end
end
但实际上,在编写类似于
Class Foo
def new
...
end
end
使用类Foo为对象定义实例方法。但是当你创建一个新实例时,你调用一个类的方法new
。如果您想重写方法Foo.new
,您应该这样写:
Class Foo
def self.new
....
end
end
但实际上,为类声明自己的方法new
是个坏主意您确定要“在定义中将罗马的默认值添加到new”吗?在我看来,您将其添加到了initialize
。这与此有什么关系?您确定要“将定义中罗马的默认值添加到new”吗?在我看来,您将其添加到了初始化。这与此有什么关系?这并没有回答问题。只是一个简单的问题。这主要是因为最后的“超级”电话吗?这并没有回答问题。只是一个简单的问题。这主要是因为最后的“超级”电话吗?