回答:
when "toyota", "lexus"
、次のようになりますunexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
。しかし、私がこれを書いた場合when "toyota","lexus"
、それは機能します。唯一の違いは、コンマの後のスペースです。
or
またはをサポートしていません。||
なぜなら、when
は単一の識別子ではなく、その右側に一連のコンマ区切りの式をとるからです。このため、があった場合when a or b
、これをwhen a, b
or 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
もう1つの一般的なアプローチは、ハッシュをディスパッチテーブルとして使用することです。各値のキーとcar
、実行するコードをカプセル化する呼び出し可能なオブジェクトである値を使用します。
when
ラインのための素晴らしいソリューション。共有いただきありがとうございます。
ロジックをデータに入れるもう1つの方法は、次のようなものです。
# 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