我需要一个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,它似乎不起作用。最好的方法是什么?还是一个不同的策略?
首先,你的逻辑有点倒退。你想说:
如果
val
不是Fixnum
而不是Integer
,则返回错误
这表示为:
if !val.is_a?(Fixnum) && !val.is_a?(Integer)
如果你将Bignum
添加到该模式,那么它将起作用。
其次,Fixnum
和Bignum
已被弃用,仅赞成Integer
(AFAIK)Ruby 2.4。方便的是,Fixnum < Integer
和Bignum < Integer
在Ruby 2.1到2.3中都是正确的,所以没有必要检查is_a? Fixnum
,is_a? Integer
和is_a? Bignum
,你可以检查is_a? Integer
,因为:
10
和10**100
都是Integer
s和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