ClojureにJavaのswitch
コンストラクトに相当するものはありますか?はいの場合、それは何ですか?いいえの場合、それを実現するためにif
else
ラダーを使用する必要がありますか?
case
マクロを試してください。
(case (+ 2 3)
6 "error"
5 "ok")
またはデフォルト値で
(case (+ 2 3)
5 "ok"
"error")
ドキュメントによると覚えておいてください
テスト定数は評価されません。それらはコンパイル時リテラルでなければならず、引用符で囲む必要はありません。 (...)
ClojureDocs で他の例を参照してください。
case Janが指摘したように、良いオプションです
cond は、関連する多くの状況で非常に役立ちます。特に、さまざまな条件式の評価に基づいて切り替える場合は特に便利です。
(defn account-message [balance]
(cond
(< balance 0) "Overdrawn!"
(< balance 100) "Low balance"
(> balance 1000000) "Rich as creosote"
:else "Good balance"))
Condの結果は最初の一致する式によって決定されるため、負のバランスでは「Overdrawn!」と表示されることに注意してください。ローバランスの場合にもマッチしますが。
[コードを編集しました-動作させるために最後の余分なブラケットを削除しました]
@Janと@mikeraの使用提案 case
または cond
(追加してもよい condp
リストに?)は機能的¹の観点からは健全であり、case
の制限(たとえば、テスト値はコンパイル時定数のみであり、デフォルトの戻り値は必須です)はswitch
いくつかの微妙な違いがあります:
case
はJava Enum
定数;
case
のディスパッチは、パフォーマンスの点でハッシュマップに匹敵するハッシュAFAIKに基づいています。 switch
ははるかに高速です;
case
でフォールスルーすることはできません。つまり、condp
の動作を反映するには、他のオプション(switch
と値セット?)を使用する必要があります。
[¹] functional-programming のように機能せず、機能を実行するように機能し、目的を果たします。