Я хочу протестировать ли a
равняется 1 или 2
Я мог сделать
a == 1 || a == 2
но это требует повторения a
(который был бы раздражающим для более длинных переменных),
Я хотел бы сделать что-то как a == (1 || 2)
, но очевидно это не будет работать
Я мог сделать [1, 2].include?(a)
, который не плох, но, кажется мне, немного тяжелее читает
Просто удивление, как делают к этому с идиоматическим рубином
Ваш первый метод - идиоматический 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]
.
Не знаю, в каком контексте вы это используете, но если это вписывается в оператор switch, то вы можете сделать:
a = 1
case a
when 1, 2
puts a
end
Еще одно преимущество: когда используется оператор case equality ===, то при желании вы можете переопределить этот метод для различного поведения. Другое преимущество состоит в том, что с ним также можно использовать диапазоны, если это соответствует вашему регистру использования:
when 1..5, 7, 10
Сначала поместите это где-нибудь:
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
Может быть, я тут и толстая, но мне кажется, что:
(1..2) === a
... работает.
Одним из способов было бы подать прошение "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. Является ли нижний пример хорошей временной заменой для верхнего примера? Ты будешь судьей.