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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在每个'when'块中具有多个值的Case语句相关的知识,希望对你有一定的参考价值。

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

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

我有大约4或5种不同的when情况,应该由大约50种不同的car值触发。有没有办法用case块做这个或者我应该尝试一个巨大的if块?

答案

case声明中,,相当于||声明中的if

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

Some other things you can do with a Ruby case statement

另一答案

您可以利用ruby的“splat”或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', ...]
  ...
end

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

以上是关于在每个'when'块中具有多个值的Case语句的主要内容,如果未能解决你的问题,请参考以下文章

myysql case when多个参数结果

如何将多个case when的结果输出到同一列?

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

sql 中 case when 语法

SQL中的case when then else end用法

mysql 查询某个字段并拼接case when出来的字段