354

私が探しているものを説明できる最善の方法は、これまでに試した失敗したコードを示すことです。

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

の約 50 の異なる可能な値によってトリガーされる必要がある約 4 つまたは 5 つの異なるwhen状況がありますcar。ブロックでこれを行う方法はありますか、それともcase大規模なブロックを試す必要がありifますか?

4

6 に答える 6

765

caseステートメントでは、 aはステートメント内,の と同等です。||if

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

Ruby の case 文でできるその他のこと

于 2012-04-17T19:00:23.460 に答える
110

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実行するコードをカプセル化する呼び出し可能なオブジェクトである値を使用します。

于 2012-04-17T19:21:23.087 に答える
2

switch/case (case/when など) は単にを比較していることを思い出してください。この例では、単純な or'd 文字列リストの比較については公式の回答が好きですが、よりエキゾチックな条件付き/一致ロジックについては、

case true
  when ['honda', 'acura'].include?(car)
    # do something
  when (condition1 && (condition2 || condition3))
    # do  something different
  else
    # do something else
end
于 2021-06-19T08:12:25.063 に答える
0

次のようなことができます(@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
于 2021-03-04T18:13:14.320 に答える