Gem::Version:尽管传入的参数数量正确,仍然遇到参数错误
我有这段代码
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
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。