Ruby多个OR条件

3

在 Ruby 中,有更简洁的方法来表达 if 语句中的多个 OR 条件吗?

例如,这是我目前拥有的代码:

if call_type == "GPRS" || call_type == "SMS" || call_type == "MMS" || call_type == "USSD" || call_type == "TELEPHONY"
  #do something
end

将会有更多的OR条件,我不想多次这样写。在ruby 2.1.0中有更好的表达方式吗?

提前感谢。


3
这个不是重复的吗? - Jörg W Mittag
1个回答

12
你可以使用 Array#include? 方法:
if %w(GPRS SMS MMS USSD TELEPHONY).include? call_type
  # ...
end

或者使用case表达式

case call_type
when 'GPRS', 'SMS', 'MMS', 'USSD', 'TELEPHONY'
  # ...
end

或者一个正则表达式

if call_type =~ /^(GPRS|SMS|MMS|USSD|TELEPHONY)$/
  # ...
end

cremno所指出^$可以匹配行的开头和结尾。如果call_type跨越了多行,您可以使用\A\z


1
你可能想使用\A/\z(字符串的开头/结尾)代替^/$(行的开头/结尾),以便与其他示例具有相同的行为(例如不接受"ABC\nSMS")。 - cremno
1
如果 arr = %w{ a b c },你可以写成 case('b'); when *arr; puts 'hi'; end #=> "hi"r = Regexp.new('^('+arr.join('|')+')$') #=> /^(a|b|c)$/; 'b'[r] #=> "b"; 'd'[r] #=> nil。当 arr 很大时,这是很方便的。 - Cary Swoveland
你最后的评论很有趣。我本以为需要/^#{Regexp.union(arr).to_s}$/(这个也可以工作),但实际上不需要使用to_s。为什么呢? - Cary Swoveland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接