只允许在Ruby

时间:2018-03-17 02:08:28

标签: ruby

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

1 个答案:

答案 0 :(得分:1)

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

  如果val不是Fixnum而不是Integer

,则

会返回错误

这表示为:

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

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

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

  1. 自Ruby 2.4起,1010**100同时IntegerFixnum以及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
  4. 简化为:

    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
    
相关问题