只允许整数作为Ruby中的参数输入

问题描述 投票:0回答:1

我需要一个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,它似乎不起作用。最好的方法是什么?还是一个不同的策略?

ruby
1个回答
1
投票

首先,你的逻辑有点倒退。你想说:

如果val不是Fixnum而不是Integer,则返回错误

这表示为:

if !val.is_a?(Fixnum) && !val.is_a?(Integer)

如果你将Bignum添加到该模式,那么它将起作用。

其次,FixnumBignum已被弃用,仅赞成Integer(AFAIK)Ruby 2.4。方便的是,Fixnum < IntegerBignum < Integer在Ruby 2.1到2.3中都是正确的,所以没有必要检查is_a? Fixnumis_a? Integeris_a? Bignum,你可以检查is_a? Integer,因为:

  1. 从Ruby 2.4开始,1010**100都是Integers和Fixnum,而Bignum正在走出困境。
  2. 在Ruby 2.1到2.3中,Fixnum(例如11)和Bignum(例如11*111)子类Integer所以11.is_a? Integer(11*111).is_a? Integer都是真的。
  3. FixnumBignum在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
© www.soinside.com 2019 - 2024. All rights reserved.