31 votes

Équivalent de commutateur Java dans Clojure?

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?

39voto

mikera Points 63056

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]

34voto

Jan Points 8207

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 .

7voto

omiel Points 899

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 Java Enum 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 ?) à miroir switch s 'comportement.


[1] non fonctionnelles dans la fonctionnelle dans l'accomplissement d'une fonction, au service d'un but.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X