2016-08-03 21 views
3

Gibt es eine Möglichkeit, Standardwerte für die in (s/keys :opt [::k1 ::k2]) genannten Schlüssel anzugeben?bieten Standardwert in clojure.spec

Etwas wie:

(s/keys :opt [(with-default ::k1 "default1") (with-default ::k2 "default2")]) 

Oder es ist mehr idiomatische Standardwerte außerhalb von clojure.spec zu behandeln?

Antwort

1

Ich glaube nicht, wie clojure.spec hauptsächlich mit Datenvalidierung und Struktur befasst ist, nicht mit Anreichern, Erzwingen oder Ändern von Daten. Du müsstest es also selbst tun. ZB:

(merge {::k1 "default" ::k2 "default"} {::k1 2}) ;;=> {::k1 2, ::k2 "default"} 

oder mit assoziativer Destrukturierung:

(let [{k1 ::k1 k2 ::k2 :or {k1 "default", k2 "default"}} 
     {::k1 2}] 
    [k1 k2]) ;; => [2 "default"] 

oder ähnlich:

(let [{:keys [::k1 ::k2] :or {k1 "default" k2 "default"}} 
     {::k1 2}] 
    [k1 k2]) ;; => [2 "default"] 
+0

Ich würde zustimmen, aber die Dokumentation sagt, dass clojure.spec/conform ihre Eingabe ändern kann. Zum Beispiel wenn: als Parameter clojure.spec/coll-of angegeben ist – aav

0

Es gibt keine explizite Funktion für diesen in spec, und ich würde erwarten, dass Sie es in der Handhabung Code, nicht in der Spezifikation.

Es ist möglich, etwas zu bauen, das dies mit s/conformer tut, aber ich würde nicht eine empfohlene Verwendung dieser Funktion betrachten.