是否可以在Ruby中创建自定义is_a?
?
我有一个字符串,可以是我需要检查和决定的UID或昵称。
UID:001ABC123
(以3个数字开头,以6个字母数字字符结尾)
昵称:john
(可以是任何东西,但绝不会以数字开头)
我希望能够做到:
t = '001ABC123'
if t.is_a? UID
...
end
有可能吗?
答案 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