在每个'when'块

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

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

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

171579 次浏览

case语句中,,等价于if语句中的||

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

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

您可以利用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的值都有键,值是一些可调用的对象,封装了你想要执行的代码。

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

# 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

你可以这样做(灵感来自@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

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

case true
when ['honda', 'acura'].include?(car)
# do something
when (condition1 && (condition2 || condition3))
# do  something different
else
# do something else
end

在case语句中,与&&在if语句中。

< p > coding_language 当‘ror’&&javascript的 #代码 < / p >结束