Подтвердить что ты не робот

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

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

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

a == 1 || a == 2

но для этого требуется повторить a (что было бы досадно для более длинных переменных)

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

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

Просто интересно, как с этим справиться с идиоматическим рубином

4b9b3361

Ответ 1

Ваш первый метод - идиоматический 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].

Ответ 2

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

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

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

when 1..5, 7, 10

Ответ 3

Один из способов - подать заявку "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. Является ли нижний пример хорошей временной заменой для верхнего примера? Вы будете судьей.

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

(1..2) === a

... работает.