2012-04-17 42 views
222

最好的办法我可以描述多个值就是我要找的是向您展示失败代码迄今我已经试过:Case语句,在每个“当”阻止

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

我已经得到约4或5个不同的when情况,应该由大约50个不同的可能值car触发。有没有办法做到这一点与case块,或者我应该尝试一个大块if块?

回答

486

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

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

Some other things you can do with a Ruby case statement

+0

莫大的联系,谢谢! – Nick 2012-04-17 19:08:44

+1

[此链接](http://ilikestuffblog.com/2008/04/15/how-to-write-case-switch-statements-in-ruby/)对Ruby中的case语句有更好的总结(它包括也是正则表达式和splat语法的例子)。 – rsenna 2013-02-20 18:59:20

+0

我不知道为什么,但这种奇怪的情况发生: 当我写这篇文章: '时,“丰田”,“雷克萨斯”', 我得到: '意外tSTRING_BEG,期待keyword_do或“{”或' (”(的SyntaxError)' 然而,当我写这篇文章:。。。。 '当 “丰田”, “雷克萨斯”', 它的工作原理 唯一不同的是逗号后的空间 – 2014-11-10 08:23:27

77

您可能需要红宝石的 “图示” 或压扁语法的优势。

这使得长满了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', ...] 
    ... 

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

另一种常见的方法是使用哈希作为调度表,与键的car每个值和一些调用对象封装要执行的代码值。

+0

在@ Nick的案例中绝对更具可读性。 (没有双关语意思) – 2012-04-17 19:30:03

+0

这就是我最终使用的东西,虽然我很不好意思带走了某人的复选标记:D – Nick 2012-04-17 19:44:41

+0

长时间线条的绝妙解决方案。感谢分享。 – Pistos 2016-04-20 14:50:25

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