2017-07-29 4 views

Antwort

3

Vom docstring:

retag wird bei der Generierung verwendet erzeugten Werte mit passenden Tags retag. retag kann entweder ein Schlüsselwort sein, bei dem der Versand-Tag zugeordnet wird, oder ein Fn des generierten Werts und Versand-Tags, die einen entsprechend retagged Wert zurückgeben sollen.

retag Wenn ein Schlüsselwort (wie in den spec guide example) ist, erzeugt intern eine Funktion multi-spechere, die in der Generator Umsetzung Funktion verwendet wird. Zum Beispiel dieser beide sind Multi-spec Erklärungen funktional äquivalent:

(s/def :event/event (s/multi-spec event-type :event/type)) 
(s/def :event/event (s/multi-spec event-type 
            (fn [genv tag] 
            (assoc genv :event/type tag)))) 

Vorbei an eine retagFunktion würde nicht wie eine sehr nützliche Option scheint Handbuch für das Beispiel gegeben, aber sinnvoller ist, wenn multi-spec für nicht mit Karten. Wenn Sie z. B. multi-spec mit s/cat z.

(defmulti foo first) 
(defmethod foo :so/one [_] 
    (s/cat :typ #{:so/one} :num number?)) 
(defmethod foo :so/range [_] 
    (s/cat :typ #{:so/range} :lo number? :hi number?)) 

foo nimmt entweder zwei oder drei args, abhängig von der ersten Arg-: function args spec. Wenn wir multi-spec versuchen naiv dies die s/cat Stichwort/Tag verwenden, wird es nicht funktionieren:

(s/def :so/foo (s/multi-spec foo :typ)) 
(sgen/sample (s/gen :so/foo)) 
;; ClassCastException clojure.lang.LazySeq cannot be cast to clojure.lang.Associative 

Dies ist, wo eine retag Funktion zu übergeben zu können, ist nützlich:

(s/def :so/foo (s/multi-spec foo (fn [genv _tag] genv))) 
(sgen/sample (s/gen :so/foo)) 
;=> 
;((:so/one -0.5) 
; (:so/one -0.5) 
; (:so/range -1 -2.0) 
; (:so/one -1) 
; (:so/one 2.0) 
; (:so/range 1.875 -4) 
; (:so/one -1) 
; (:so/one 2.0) 
; (:so/range 0 3) 
; (:so/one 0.8125)) 
+0

Sie für große danken Erklärung und Beispiele! – OlegTheCat

Verwandte Themen