Проверьте, равна ли переменная одному из двух значений
Я хочу проверить, равен ли a
1 или 2
Я мог бы сделать
a == 1 || a == 2
но для этого требуется повторить a
(что было бы досадно для более длинных переменных)
Я хотел бы сделать что-то вроде a == (1 || 2)
, но, очевидно, это не сработает
Я мог бы сделать [1, 2].include?(a)
, что неплохо, но мне кажется немного труднее читать
Просто интересно, как с этим справиться с идиоматическим рубином
Ответы
Ответ 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
... работает.