Лучший способ описать то, что я ищу, это показать вам неудачный код, который я пробовал до сих пор:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
У меня есть около 4 или 5 различных when
ситуаций, которые должны быть вызваны примерно 50 различными значениями car
. Есть ли способ сделать это с case
блоками, или я должен попробовать массивный if
блок?
when "toyota", "lexus"
я получаю:unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
. Однако когда я пишу этоwhen "toyota","lexus"
, это работает. Единственная разница - это пробел после запятой.or
или||
здесь, потому чтоwhen
справа от него находится последовательность разделенных запятыми выражений, а не один идентификатор. Из-за этого, если у вас естьwhen a or b
, не ясно, следует ли это принимать в качестве эквивалентаwhen a, b
илиwhen (a or b)
, последнее из которыхa or b
сначала вычисляет выражение, прежде чем выбросить его в when. Более удивительным и менее простым в обращении с языком является наличие токенов, которые изменяют поведение в зависимости от контекста, и тогда вы не сможете использовать настоящееor
выражение в правой части слова «когда».Вы можете воспользоваться синтаксисом рубина или сглаживающим синтаксисом.
Это делает переросшие
when
предложения - у вас есть около 10 значений для тестирования на ветку, если я правильно понимаю - немного более читабельным, на мой взгляд. Кроме того, вы можете изменить значения для тестирования во время выполнения. Например:Другим распространенным подходом было бы использование хеша в качестве таблицы диспетчеризации с ключами для каждого значения
car
и значениями, которые являются вызываемым объектом, инкапсулирующим код, который вы хотите выполнить.источник
when
очередей. Спасибо, что поделился.Другой хороший способ поместить вашу логику в данные - это что-то вроде этого:
источник