我正在查看以下代码:
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)为什么?
发布于 2016-06-13 16:12:31
因为Mo.new(2)调用方法Mo.new,默认情况下该方法用它接收的单个参数2调用方法Mo#initialize,但是Mo#initialize需要两个参数。
发布于 2016-06-13 16:12:33
不需要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但是您可以在您的self.new类中重写Mo。
def self.new(indy, rome = 1)
end然后
p Mo.method(:new).source_location
# =>["mo.rb", 2]并且它不会进入initialize方法。
这不是很好的实践,但是如果你想要执行你的代码,你应该调用
Mo.new(2).new(3)因为您的new是Mo实例方法
发布于 2016-06-13 16:17:22
当你写这样的代码时
Class Foo
def new
...
end
end使用Foo类为对象定义实例方法。但是,当您创建一个新实例时,您将调用一个类的方法new。如果您想重写方法Foo.new,您应该编写如下:
Class Foo
def self.new
....
end
end但是实际上,为类声明自己的方法new是个坏主意。
https://stackoverflow.com/questions/37794481
复制相似问题