Проверьте, равна ли переменная одному из двух значений


Я хочу проверить, является ли a равна 1 или 2

я мог бы сделать

a == 1 || a == 2

но это требует повторения a (что было бы раздражающим для более длинных переменных)

Я хотел бы сделать что-то вроде a == (1 || 2), но очевидно, что это не сработает

я мог бы сделать [1, 2].include?(a), что не плохо, но меня поражает как немного труднее читать

просто интересно, как это сделать с идиоматическим ruby

7 52

7 ответов:

ваш первый метод-идиоматический Ruby. К сожалению, Ruby не имеет эквивалента Python a in [1,2], что, я думаю, было бы лучше. Ваш [1,2].include? a это ближайшая альтернатива, и я думаю, что это немного назад от самого естественного способа.

конечно, если вы используете это много, вы могли бы сделать это:

class Object
  def member_of? container
    container.include? self
  end
end

и тогда вы можете сделать a.member_of? [1, 2].

Я не знаю, в каком контексте вы используете это, но если это вписывается в оператор switch, вы можете сделать:

a = 1
case a
when 1, 2
  puts a
end

некоторые другие преимущества заключаются в том, что при использовании оператора case equality===, поэтому, если вы хотите, вы можете переопределить этот метод для другого поведения. Другое, что вы также можете использовать диапазоны с ним тоже, если это соответствует вашему случаю использования:

when 1..5, 7, 10

одним из способов было бы ходатайство "Matz", чтобы добавить эту функциональность в спецификацию Ruby.

if input == ("quit","exit","close","cancel") then
  #quit the program
end

но оператор case-when уже позволяет вам делать именно это:

case input when "quit","exit","close","cancel" then 
  #quit the program
end

когда написано на одной строке, как это, он действует и почти выглядит как оператор if. Является ли нижний пример хорошей временной заменой для верхнего примера? Ты будешь судьей.

сначала поставьте это где-нибудь:

class Either < Array
  def ==(other)
    self.include? other
  end
end

def either(*these)
  Either[*these]
end

затем:

if (either 1, 2) == a
  puts "(i'm just having fun)"
end

вы можете просто использовать пересечение, как

([a] & [1,2]).present?

альтернативный способ.

a.to_s()=~/^(1|2)$/

может быть, я здесь толстый, но мне кажется, что:

(1..2) === a

...завод.