Тест, равняется ли переменная любому из двух значений

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

Я мог сделать

a == 1 || a == 2

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

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

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

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

56
задан Tom Lehman 3 February 2010 в 23:53
поделиться

6 ответов

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

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

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

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

38
ответ дан 26 November 2019 в 17:29
поделиться

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

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

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

when 1..5, 7, 10
11
ответ дан 26 November 2019 в 17:29
поделиться

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

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
6
ответ дан 26 November 2019 в 17:29
поделиться

Может быть, я тут и толстая, но мне кажется, что:

(1..2) === a

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

0
ответ дан 26 November 2019 в 17:29
поделиться
a.to_s()=~/^(1|2)$/
2
ответ дан 26 November 2019 в 17:29
поделиться

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

8
ответ дан 26 November 2019 в 17:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: