在 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中有更好的表达方式吗?
提前感谢。
在 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中有更好的表达方式吗?
提前感谢。
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
。
\A
/\z
(字符串的开头/结尾)代替^
/$
(行的开头/结尾),以便与其他示例具有相同的行为(例如不接受"ABC\nSMS"
)。 - cremnoarr = %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