Оператор Case с несколькими значениями в каждом блоке «когда»

217

Лучший способ, которым я могу описать то, что я ищу, - показать вам неудачный код, который я пробовал до сих пор:

case car
  when ['honda', 'acura'].include?(car)
    # code
  when 'toyota' || 'lexus'
    # code
end

У меня есть около 4 или 5 различных ситуаций when, которые должны запускаться примерно с 50 различными возможными значениями car. Есть ли способ сделать это с помощью блоков case или я должен попробовать массивный блок if?

Теги:
switch-statement
syntax

3 ответа

483
Лучший ответ

В операторе case a , является эквивалентом || в инструкции if.

case car
   when 'toyota', 'lexus'
      # code
end

Некоторые другие вещи, которые вы можете сделать с утверждением case Ruby

  • 0
    Отличная ссылка, спасибо!
  • 1
    Эта ссылка содержит более качественную сводку инструкций case в Ruby (и она также включает примеры синтаксиса regexp и splat).
Показать ещё 6 комментариев
80

Вы можете использовать синтаксис "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 и значениями, которые являются некоторыми вызываемыми объектами, инкапсулирующими код, который вы хотите выполнить.

  • 0
    Определенно более читабельный в случае @ Ника. (Не каламбур)
  • 0
    Это то, чем я в конечном итоге пользуюсь, хотя мне неприятно снимать чью-то галочку: D
Показать ещё 1 комментарий
0

Еще один хороший способ поместить вашу логику в данные - это примерно так:

# 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню