我需要一个Ruby脚本,它只接受Ruby 2.1及更高版本中的整数(即处理Bignum,Fixnum和Integer)。
我有:
def push(val)
return "only integers can be used" if !val.is_a?(Fixnum) || !val.is_a?(Integer)
但如果我添加Bignum,它似乎不起作用。最好的方法是什么?还是一个不同的策略?
答案 0 :(得分:1)
首先,你的逻辑有点倒退。你想说:
如果val
不是Fixnum
而不是Integer
,则会返回错误
这表示为:
if !val.is_a?(Fixnum) && !val.is_a?(Integer)
如果您将Bignum
添加到该模式,那么它将起作用。
其次,从{AFAIK)Ruby 2.4开始,Fixnum
和Bignum
已被弃用,仅赞成Integer
。方便的是,{2.1}到2.3中Fixnum < Integer
和Bignum < Integer
都是正确的,所以没有必要检查is_a? Fixnum
,is_a? Integer
和is_a? Bignum
,你可以检查is_a? Integer
,因为:
10
和10**100
同时Integer
和Fixnum
以及Bignum
即将开始。Fixnum
(例如11
)和Bignum
(例如11*111
)子类Integer
所以11.is_a? Integer
和(11*111).is_a? Integer
是真的。Fixnum
和Bignum
在2.4完全消失,现在只有Integer
。简化为:
return "only integers can be used" if !val.is_a?(Integer)
或者也许:
return 'only integers can be used' unless val.is_a?(Integer)
或者如果您想稍微宽松并允许'23'
,请使用Kernel#Integer
:
def push(val)
val = Integer(val)
#...
rescue ArgumentError, TypeError
return 'only integers can be used'
end
或者,取决于您希望rescue
申请的代码数量:
def push(val)
begin
val = Integer(val)
rescue ArgumentError, TypeError
return 'only integers can be used'
end
#...
end
或者也许:
def push(val)
val = Integer(val) rescue nil
return 'only integers can be used' if(val.nil?)
#...
end