Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby `initialize`似乎要检查给定给`new'的参数`_Ruby_New Operator_Initializer - Fatal编程技术网

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”吗?在我看来,您将其添加到了
初始化
。这与此有什么关系?这并没有回答问题。只是一个简单的问题。这主要是因为最后的“超级”电话吗?这并没有回答问题。只是一个简单的问题。这主要是因为最后的“超级”电话吗?