79 votes

Clojure - arguments nommés

Clojure a-t-il des arguments nommés? Si oui, pouvez-vous s'il vous plaît en donner un petit exemple?

120voto

Rayne Points 14518

En Clojure 1.2, vous pouvez se déstructurent l' rest argument juste comme vous le feriez pour se déstructurent une carte. Cela signifie que vous pouvez faire nommée non-positionnement de mots clés arguments. Voici un exemple:

user> (defn blah [& {:keys [key1 key2 key3]}] (str key1 key2 key3))
#'user/blah
user> (blah :key1 "Hai" :key2 " there" :key3 10)
"Hai there10"
user> (blah :key1 "Hai" :key2 " there")
"Hai there"
user> (defn blah [& {:keys [key1 key2 key3] :as everything}] everything)
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
{:key2 " there", :key1 "Hai"}

Tout ce que vous pouvez faire tout en déstructurant un Clojure de la carte peut être fait en fonction de l'argument de la liste comme indiqué ci-dessus. Y compris à l'aide de :ou pour définir des valeurs par défaut pour les arguments, comme ceci:

user> (defn blah [& {:keys [key1 key2 key3] :or {key3 10}}] (str key1 key2 key3))
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
"Hai there10"

Mais c'est en Clojure 1.2. Sinon, dans les anciennes versions, vous pouvez le faire à simuler la même chose:

user> (defn blah [& rest] (let [{:keys [key1 key2 key3] :or {key3 10}} (apply hash-map rest)] (str key1 key2 key3)))
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
"Hai there10"

et qui fonctionne généralement de la même manière.

Et vous pouvez aussi avoir des arguments de position qui viennent avant le mot-clé arguments:

user> (defn blah [x y & {:keys [key1 key2 key3] :or {key3 10}}] (str x y key1 key2 key3))
#'user/blah
user> (blah "x" "Y" :key1 "Hai" :key2 " there")
"xYHai there10"

Ce ne sont pas facultatifs et doivent être fournis.

Vous pouvez réellement se déstructurent l' rest argument comme vous le feriez tout Clojure collection.

user> (defn blah [& [one two & more]] (str one two "and the rest: " more))
#'user/blah
user> (blah 1 2 "ressssssst")
"12and the rest: (\"ressssssst\")"

Vous pouvez faire ce genre de chose, même en Clojure 1.1. La carte de style déstructurant pour le mot-clé arguments ne sont entrées en 1.2.

34voto

Alex Taggart Points 5733

En plus de Raynes " excellente réponse, il y a aussi une macro en clojure-contrib qui rend la vie plus facile:

utilisateur=> (utilisation " [clojure.contrib.def : [defnk]])
nul
utilisateur=> (defnk foo [b :c 8 :d 9] 
 [a b c d])
#'utilisateur/foo
utilisateur=> (foo 1 de 2)
[1 2 8 9]
utilisateur=> (foo 1 2 3)
java.lang.IllegalArgumentException: Pas de valeur fournie pour la clé: 3 (NO_SOURCE_FILE:0)
utilisateur=> (foo 1 2 :3 c)
[1 2 3 9]

0voto

Abel Points 24335

Voulez-vous dire peut-être paramètres nommés ? Ce ne sont pas directement disponibles, mais vous pouvez utiliser cette approche de vecteurs si vous le souhaitez, ce qui peut vous donner ce que vous voulez.

Chez RosettaCode, vous trouverez une explication plus détaillée sur la manière de procéder en utilisant la déstructuration.

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