自定义.is_a?在Ruby中

时间:2016-01-13 19:45:23

标签: ruby

是否可以在Ruby中创建自定义is_a?

我有一个字符串,可以是我需要检查和决定的UID或昵称。

UID:001ABC123(以3个数字开头,以6个字母数字字符结尾)

昵称:john(可以是任何东西,但绝不会以数字开头)

我希望能够做到:

t = '001ABC123'

if t.is_a? UID
  ...
end

有可能吗?

3 个答案:

答案 0 :(得分:7)

如果您正在寻找简洁的方法来进行检查,为什么不使用正则表达式并使用=~运算符进行匹配。

这与使用自定义is_a?一样整洁,并且不需要弄乱String类。

例如:

UID = /^[[:digit:]]{3}[[:alnum:]]{6}$/

t = '001ABC123'

if t =~ UID
   #...
end

答案 1 :(得分:0)

不污染全球String - 使用优化:

class UID < String
end

module CustomStringIsA
  refine String do
    def is_a? what
      if what == UID
        self == '123'
      else
        super
      end
    end
  end
end

puts '123'.is_a?(UID) # false

using CustomStringIsA
puts '123'.is_a?(Fixnum) # false
puts '123'.is_a?(UID) # true

但最好使用===,这样您就可以像这样使用case

class UID < String
  def self.=== str
    str === '123'
  end
end

class UID2 < String
  def self.=== str
    str === '456'
  end
end

case '456'
when UID
  puts 'uid'
when UID2
  puts 'uid2'
else
  puts 'else'
end

答案 2 :(得分:-2)

红宝石的一大优点是你可以重新开课。所以这个实现可能如下所示:

class String
    def is_a?(type)
        return true if type == UID
    end
end