Existe-t-il un équivalent pour la construction switch
de Java dans Clojure? Si oui, qu'est ce que c'est? Si non, devons-nous utiliser l'échelle if
else
pour y parvenir?
Réponses
Trop de publicités?cas est une bonne option, comme l'a souligné Jan
cond est également très utile dans de nombreuses circonstances, notamment si vous souhaitez basculer sur la base de l'évaluation d'une gamme de différentes expressions conditionnelles, par exemple
(defn account-message [balance]
(cond
(< balance 0) "Overdrawn!"
(< balance 100) "Low balance"
(> balance 1000000) "Rich as creosote"
:else "Good balance"))
Notez que le résultat de cond est déterminé par le premier correspondant à l'expression, donc un solde négatif affichera "à Découvert!", même si elle correspond également à la faible équilibre de cas.
[J'ai édité le code retiré le support supplémentaire à la fin pour le faire fonctionner]
Essayez la macro case
:
(case (+ 2 3)
6 "error"
5 "ok")
ou avec une valeur par défaut
(case (+ 2 3)
5 "ok"
"error")
N'oubliez pas que selon la documentation
Les constantes de test ne sont pas évaluées. Ils doivent être des littéraux au moment de la compilation et n'ont pas besoin d'être cités. (...)
Voir plus d'exemples sur ClojureDocs .
Si @Jan et @mikera suggestions pour utiliser case
ou cond
(peut-je ajouter condp
à la liste?) sont son à partir d'une functional1 point de vue et si case
's des limitations (par exemple, les valeurs d'essai ne peuvent être des constantes de compilation ; une valeur de retour par défaut est obligatoire) miroir de celles de l' switch
il ya quelques différences subtiles:
case
ne peut pas être utilisé avec JavaEnum
des constantes ;case
s 'expédition est basé sur le hachage autant que je sache, ce qui le rend comparable à hashmaps en termes de performances ;switch
est plus rapide ;vous ne pouvez pas tomber par
case
, ce qui signifie que vous devez utiliser d'autres options (condp
de la valeur de jeux ?) à miroirswitch
s 'comportement.
[1] non fonctionnelles dans la fonctionnelle de la programmationfonctionnelle dans l'accomplissement d'une fonction, au service d'un but.