Gem::Version:尽管传入的参数数量正确,仍然遇到参数错误

编程语言 2026-07-08

我有这段代码

class EmptyVersion < Gem::Version
    def initialize
      super('')
    end
end

v = EmptyVersion.new

运行这段代码会得到:

'new': wrong number of arguments (given 0, expected 1) (ArgumentError)

为什么?

我是在不带参数的情况下调用 EmptyVersion 的构造函数(这应该没问题),而在里面我又调用了 Gem::Version 的构造函数并传入一个参数(这也应该没问题)。

解决方案

这是因为 Gem::Version 不仅实现了 initialize 实例方法,而且还重写了 new 方法,如下所示:

class Gem::Version

  # ...

  def self.new(version) # :nodoc:
    return super unless self == Gem::Version

    @@all[version] ||= super
  end

  # ...
end

默认实现 不同,默认实现可以接受任意数量的参数(甚至可以没有参数),并把它们传给 initialize,而该变体恰好只接受一个参数,因此会产生错误信息。

你可以在子类中再次覆盖 new 类方法,例如:

class EmptyVersion < Gem::Version
  def self.new
    super('')
  end
end

或:

class EmptyVersion < Gem::Version
  def self.new(version = '')
    super
  end
end

更多阅读:在Ruby中,'new' 与 'initialize' 之间的关系是什么?在初始化时如何返回nil?

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章