测试变量是否与if-elsif链长的几个字符串中的任何一个匹配,或者case-when

时间:2011-02-04 01:57:12

标签: ruby string comparison

我认为在ruby中有一个很好的单行方式

if mystr == "abc" or "def " or "ghi" or "xyz"

但在我通常咨询的在线参考文献中找不到如何做到这一点...

谢谢!

3 个答案:

答案 0 :(得分:23)

也许你不知道你可以在一个案例上加上多个条件:

case mystr
  when "abc", "def", "ghi", "xyz"
    ..
end

但对于这个特定的基于字符串的测试,我会使用正则表达式:

if mystr =~ /\A(?:abc|def|ghi|xyz)\z/

如果您不想构造正则表达式,并且您不想要case语句,则可以创建一个对象数组并使用Array#include? test来查看该对象是否在数组:

if [a,b,c,d].include?( o )

或者,通过猴子修补对象,您甚至可以将它转过来:

class Object
  def in?( *values )
    values.include?( self )
  end
end

if o.in?( a, b, c, d )

答案 1 :(得分:13)

您可以像这样使用Array#include?

if ["abc", "def ", "ghi", "xyz"].include?(mystr)

答案 2 :(得分:3)

>> mystr="abc"
=> "abc"
>> mystr[/\A(abc|def|ghi|xyz)\z/]
=> "abc"
>> mystr="abcd"
=> "abcd"
>> mystr[/\A(abc|def|ghi|xyz)\z/]
=> nil