我能描述我正在寻找的东西的最好方式是向您展示我迄今为止尝试过的失败代码:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
我有大约4到5个不同的情况应该由大约50个不同的car值触发。有办法做到这一点的情况块或我应该尝试一个巨大的if块?
我能描述我正在寻找的东西的最好方式是向您展示我迄今为止尝试过的失败代码:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
我有大约4到5个不同的情况应该由大约50个不同的car值触发。有办法做到这一点的情况块或我应该尝试一个巨大的if块?
当前回答
另一种将逻辑放入数据的好方法是这样的:
# 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
其他回答
另一种将逻辑放入数据的好方法是这样的:
# 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
您可以利用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值都有键,值是一些可调用对象,它们封装了您希望执行的代码。
你可以这样做(灵感来自@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
在case语句中,a相当于if语句中的||。
case car
when 'toyota', 'lexus'
# code
end
使用Ruby case语句还可以做其他一些事情
在case语句中,相当于if语句中的&&。
案例coding_language 当'ror' && 'javascript' #代码 结束