Лучший способ, которым я могу описать то, что я ищу, - показать вам неудачный код, который я пробовал до сих пор:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
У меня есть около 4 или 5 различных ситуаций when
, которые должны запускаться примерно с 50 различными возможными значениями car
. Есть ли способ сделать это с помощью блоков case
или я должен попробовать массивный блок if
?
В операторе case
a ,
является эквивалентом ||
в инструкции if
.
case car
when 'toyota', 'lexus'
# code
end
Некоторые другие вещи, которые вы можете сделать с утверждением case Ruby
Вы можете использовать синтаксис "splat" ruby или flattening.
Это делает заросшие предложения when
- у вас есть около 10 значений для проверки на каждую ветку, если я правильно понимаю - немного более читаемый, на мой взгляд. Кроме того, вы можете изменять значения для тестирования во время выполнения. Например:
honda = ['honda', 'acura', 'civic', 'element', 'fit', ...]
toyota = ['toyota', 'lexus', 'tercel', 'rx', 'yaris', ...]
...
if include_concept_cars:
honda += ['ev-ster', 'concept c', 'concept s', ...]
...
case car
when *toyota
# Do something for Toyota cars
when *honda
# Do something for Honda cars
...
end
Другим распространенным подходом было бы использовать хеш в качестве таблицы отправки с ключами для каждого значения car
и значениями, которые являются некоторыми вызываемыми объектами, инкапсулирующими код, который вы хотите выполнить.
Еще один хороший способ поместить вашу логику в данные - это примерно так:
# Initialization.
CAR_TYPES = {
foo_type: ['honda', 'acura', 'mercedes'],
bar_type: ['toyota', 'lexus']
# More...
}
@type_for_name = {}
CAR_TYPES.each { |type, names| names.each { |name| @type_for_name[type] = name } }
case @type_for_name[car]
when :foo_type
# do foo things
when :bar_type
# do bar things
end