Gem::Version 抛出ArgumentError:传参数量正确仍报错?
问题解答
原因
Gem::Version没有遵循Ruby默认的实例化逻辑——它重写了类方法self.new,这个自定义的new方法强制要求调用时必须传入至少一个参数,并且在实例化流程的早期就完成了参数校验,根本没机会执行你子类里的initialize方法。
你以为重写initialize就能控制参数传入规则,但实际上父类的new方法才是实例化的入口,它先拦截了参数检查,直接导致了报错。
解决办法
有两种可行的处理方式:
方式一:跳过父类的new,手动完成实例化
直接用allocate创建空实例,再手动调用initialize方法:
v = EmptyVersion.allocate v.initialize
方式二:重写子类的self.new方法
覆盖父类的new逻辑,让子类支持无参调用:
class EmptyVersion < Gem::Version def self.new obj = allocate obj.initialize obj end def initialize super('') end end v = EmptyVersion.new # 现在可正常运行
内容的提问来源于stack exchange,提问作者user1934428
相关产品推荐
相关产品推荐

