首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`initialize`’似乎检查了给‘the’的参数

‘`initialize`’似乎检查了给‘the’的参数
EN

Stack Overflow用户
提问于 2016-06-13 16:09:46
回答 3查看 52关注 0票数 1

我正在查看以下代码:

代码语言:javascript
复制
class Mo
  def new(indy, rome = 1)
    initialize(indy, rome)
  end
  def initialize(indy, rome)
    ...
  end
end

Mo.new(2)

我得到了这个输出:

代码语言:javascript
复制
test.rb:6:in `initialize': wrong number of arguments (1 for 2)   (ArgumentError)

如果我在定义中将rome的默认值添加到new中,它可以工作:

代码语言:javascript
复制
class Mo
  def new(indy, rome = 1)
    initialize(indy, rome)
  end
  def initialize(indy, rome = 1)
    ...
  end
end

Mo.new(2)

为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-13 16:12:31

因为Mo.new(2)调用方法Mo.new,默认情况下该方法用它接收的单个参数2调用方法Mo#initialize,但是Mo#initialize需要两个参数。

票数 4
EN

Stack Overflow用户

发布于 2016-06-13 16:12:33

不需要new方法,因为initialize是分配(创建) ruby对象的“中间件”

代码语言:javascript
复制
class Mo
  def initialize(indy, rome = 1)
    @indy = indy
    @rome = rome
  end
end
i = Mo.new(2)

这意味着ruby不进入new方法。

你可以通过以下方式检查:

代码语言:javascript
复制
puts Mo.method(:new).source_location
# => nil

但是您可以在您的self.new类中重写Mo

代码语言:javascript
复制
def self.new(indy, rome = 1)
end

然后

代码语言:javascript
复制
p Mo.method(:new).source_location
# =>["mo.rb", 2]

并且它不会进入initialize方法。

这不是很好的实践,但是如果你想要执行你的代码,你应该调用

代码语言:javascript
复制
Mo.new(2).new(3)

因为您的newMo实例方法

票数 4
EN

Stack Overflow用户

发布于 2016-06-13 16:17:22

当你写这样的代码时

代码语言:javascript
复制
Class Foo
  def new
    ...
  end
end

使用Foo类为对象定义实例方法。但是,当您创建一个新实例时,您将调用一个类的方法new。如果您想重写方法Foo.new,您应该编写如下:

代码语言:javascript
复制
Class Foo
  def self.new
    ....
  end
end

但是实际上,为类声明自己的方法new是个坏主意。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37794481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档