Проверьте, равна ли переменная одному из двух значений - PullRequest
55 голосов
/ 04 февраля 2010

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

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

a == 1 || a == 2

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

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

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

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

Ответы [ 7 ]

37 голосов
/ 04 февраля 2010

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

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

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

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

11 голосов
/ 04 февраля 2010

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

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

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

when 1..5, 7, 10
8 голосов
/ 30 августа 2010

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

5 голосов
/ 03 февраля 2016

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

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

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

5 голосов
/ 04 февраля 2010

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

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
3 голосов
/ 04 февраля 2010
a.to_s()=~/^(1|2)$/
0 голосов
/ 04 февраля 2010

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

(1..2) === a

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...