Ruby 2.1+仅允许整数作为参数的脚本实现问题咨询
解决Ruby整数类型判断的兼容问题
首先得指出你原来代码里的逻辑问题:你写的!val.is_a?(Fixnum) || !val.is_a?(Integer)其实是个逻辑错误——因为Fixnum本身就是Integer的子类,所以任何Fixnum实例都会满足val.is_a?(Integer)。这样一来,当传入Bignum时,!val.is_a?(Fixnum)是true,整个||表达式就会返回true,直接触发错误提示,这就是为什么添加Bignum后无法正常工作的原因。
最优实现方案
要兼容Ruby 2.1及以上所有版本(包括2.4+统一Integer类型的情况),其实只需要一行简单的判断:
def push(val) return "only integers can be used" unless val.is_a?(Integer) # 这里写你后续的业务逻辑 end
为什么这行代码能解决问题?原因很简单:
- 在Ruby 2.1~2.3中,
Fixnum和Bignum都是Integer的子类,所以不管是小整数还是大整数,val.is_a?(Integer)都会返回true; - 在Ruby 2.4及以后,官方已经移除了
Fixnum和Bignum,所有整数都统一为Integer类型,这行代码依然能正常工作。
额外说明
如果你担心有人自定义了Integer的子类并传入,想要严格限制为标准整数类型,别用val.class == Integer——因为在Ruby 2.1~2.3中,Fixnum和Bignum的class并不是Integer,这样会把合法的小整数和大整数排除在外,还是is_a?(Integer)最稳妥。
另外,绝对不要写val.is_a?(Fixnum) || val.is_a?(Bignum)这种判断,因为在Ruby 2.4+中这两个类已经不存在了,会直接抛出NameError,完全不兼容新版本。
内容的提问来源于stack exchange,提问作者timpone
相关产品推荐
相关产品推荐

