354

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

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

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

4

6 回答 6

765

case语句中,a,等价||if语句中。

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

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

于 2012-04-17T19:00:23.460 回答
110

您可能会利用 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和值是封装您希望执行的代码的一些可调用对象。

于 2012-04-17T19:21:23.087 回答
2

请记住 switch/case(case/when 等)只是比较。我喜欢这种情况下的官方答案,用于简单的或字符串列表比较,但对于更奇特的条件/匹配逻辑,

case true
  when ['honda', 'acura'].include?(car)
    # do something
  when (condition1 && (condition2 || condition3))
    # do  something different
  else
    # do something else
end
于 2021-06-19T08:12:25.063 回答
0

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

# 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
于 2017-05-23T23:23:22.073 回答
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
于 2021-03-04T18:13:14.320 回答
-2

In a case statement, equivalent of && in an if statement.

case coding_language when 'ror' && 'javascript' # code end

于 2021-11-15T15:10:25.153 回答