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

时间:2012-04-17 18:51:42

标签: ruby-on-rails ruby syntax switch-statement

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

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

我有大约4或5种不同的when情况应该由大约50种不同的car可能值触发。有没有办法用case块执行此操作,还是应该尝试大量if块?

5 个答案:

答案 0 :(得分:597)

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

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

Some other things you can do with a Ruby case statement

答案 1 :(得分:92)

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

这会产生过度生长的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的值,以及一些可调用对象的值,封装您希望执行的代码。

答案 2 :(得分:2)

将逻辑放入数据的另一种好方法是:

 WebDriverError: File not found: /root/cdt-tests/csv-data/IT-DE-Jasper.csv

答案 3 :(得分:0)

你可以做这样的事情(灵感来自@pilcrow 的回答):

honda  = %w[honda acura civic element fit ...]
toyota = %w[toyota lexus tercel rx yaris ...]

honda += %w[ev_ster concept_c concept_s ...] if include_concept_cars

case car
when *toyota
  # Do something for Toyota cars
when *honda
  # Do something for Honda cars
...
end

答案 4 :(得分:0)

记住 switch/case(case/when 等)只是比较。我喜欢这个例子中的官方答案,用于简单的 or'd 字符串列表比较,但对于更奇特的条件/匹配逻辑,

{
  "randomID": null,
  "name": "MyName",
  "address": {
    "street": "123Street",
    "city": "MyCity"
  },
  "i#d": "some value"
}