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

Nic*_*ick 298 ruby syntax ruby-on-rails switch-statement

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

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

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

Cha*_*ell 644

case声明中,a ,等同||if声明.

case car
   when 'toyota', 'lexus'
      # code
end
Run Code Online (Sandbox Code Playgroud)

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

  • Ruby在这里不支持`or`或`|||`,因为`when`会在其右侧使用一系列逗号分隔的表达式,而不是单个标识符。因此,如果您具有“当a或b时”,则不清楚是否将其等同于“当a,b时”或“当(a或b)时”,后者将计算表达式首先将`a或b`放入when中。使该语言具有基于上下文更改行为的令牌,这更令人惊讶且不那么容易处理,然后您将无法在when的右侧使用真实的“或”表达式。 (2认同)

pil*_*row 97

您可以利用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
Run Code Online (Sandbox Code Playgroud)

另一种常见的方法是使用散列作为调度表,每个值的值car和值是一些可调用的对象,封装了您希望执行的代码.