Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Test if variable matches any of several strings w/o long if-elsif chain, or case-when

I assume there is a nice one-line way to say in ruby

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

but cannot find how to do that in the online references I normally consult...

Thanks!

like image 934
jpw Avatar asked Feb 04 '11 01:02

jpw


3 Answers

Perhaps you didn't know that you can put multiple conditions on a single case:

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

But for this specific string-based test, I would use regex:

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

If you don't want to construct a regex, and you don't want a case statement, you can create an array of objects and use Array#include? test to see if the object is in the array:

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

or, by monkey-patching Object, you can even turn it around:

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

if o.in?( a, b, c, d )
like image 184
Phrogz Avatar answered Sep 18 '22 09:09

Phrogz


You can use Array#include? like this:

if ["abc", "def ", "ghi", "xyz"].include?(mystr)
like image 25
sepp2k Avatar answered Sep 21 '22 09:09

sepp2k


>> mystr="abc"
=> "abc"
>> mystr[/\A(abc|def|ghi|xyz)\z/]
=> "abc"
>> mystr="abcd"
=> "abcd"
>> mystr[/\A(abc|def|ghi|xyz)\z/]
=> nil
like image 39
kurumi Avatar answered Sep 19 '22 09:09

kurumi