Answers:
when "toyota", "lexus"
,我得到:unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
。但是,当我编写此代码时:when "toyota","lexus"
,它可以工作。唯一的区别是逗号后有一个空格。
or
或||
在这里是因为when
采取了一系列逗号分隔的表达式来它的权利,而不是一个单一的标识符。因此,如果您有when a or b
,则不清楚是否将其视为when a, b
或的等效项 when (a or b)
,后者将a or b
首先将表达式求值,然后再将其放入when中。使该语言具有基于上下文更改行为的令牌,这更令人惊讶且不那么容易处理,然后您将无法在or
when的右侧使用真实的表达式。
您可能会利用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
和键值是一些可调用对象,这些键封装了您希望执行的代码。
when
。感谢分享。
将逻辑放入数据中的另一种好方法是:
# 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