Проверьте, соответствует ли переменная какой-либо из нескольких строк без длинной цепочки if-elsif или case-when - PullRequest
16 голосов
/ 04 февраля 2011

Полагаю, что в ruby ​​есть хороший способ написать в одну строку

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

, но я не могу найти, как это сделать в онлайн-справочниках, с которыми я обычно консультируюсь ...

Спасибо!

Ответы [ 3 ]

23 голосов
/ 04 февраля 2011

Возможно, вы не знали, что вы можете поместить несколько условий в один случай:

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

Но для этого конкретного теста на основе строк я бы использовал регулярное выражение:

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

Если вы не хотите создавать регулярное выражение и вам не нужен оператор case, вы можете создать массив объектов и использовать тест Array#include?, чтобы проверить, является ли объектв массиве:

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

или с помощью функции «Обезьяны-патчи» вы можете даже перевернуть его:

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

if o.in?( a, b, c, d )
13 голосов
/ 04 февраля 2011

Вы можете использовать Array#include? так:

if ["abc", "def ", "ghi", "xyz"].include?(mystr)
3 голосов
/ 04 февраля 2011
>> mystr="abc"
=> "abc"
>> mystr[/\A(abc|def|ghi|xyz)\z/]
=> "abc"
>> mystr="abcd"
=> "abcd"
>> mystr[/\A(abc|def|ghi|xyz)\z/]
=> nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...