Case语句在每个'when'块中有多个值

我可以描述我正在寻找的最好的方法是向您展示迄今为止我尝试过的失败的代码:

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

when大约50种不同的可能的car价值应该触发的情况下,我已经有了大约4或5种不同的情况。 有没有办法做到这一点的case或者我应该尝试一个巨大的, if块?

在一个case语句中,a是||的等价物 在if语句中。

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

Ruby case语句可以做的其他一些事情

你可能会利用ruby的“splat”或扁平化语法。

when条款when会长满 – 如果我理解正确的话,你有大约10个值来testing每个分支 – 在我看来,可读性更强一些。 另外,您可以修改要在运行时testing的值。 例如:

 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