我在尝试使用 Clojure spec,经常需要创建定制的谓词函数。有时这些谓词函数还需要一个定制的生成器。我该如何在不同的属性间共享这个谓词+生成器组?
(此外,这并不是那么重要,但我可以把这个谓词-fn + 生成器的组合叫做 spec 吗?)
示例
假设我有一个定制的谓词
(defn local-date? [x]
(instance? LocalDate x))
然后为它定义一个新的生成器函数
(defn local-date-generator []
(gen/fmap #(LocalDate/ofInstant (Instant/ofEpochMilli %) (ZoneId/of "UTC"))
(gen/large-integer)))
我将继续定义一个属性,例如
(s/def :person/birth-date (s/with-gen local-date local-date-generator))
然后每次我创建一个 LocalDate 属性时,我都需要定义这个 s/with-gen
。
如何将之抽象化呢?
我得出结论,这样做的方法是定义一个命名空间中的一个属性(例如 myprojec.specs
),在该命名空间中创建一个具有该规范的属性
(s/def ::local-date (s/with-gen local-date local-date-generator))
然后就可以在其他地方复用它
(s/def :person/birth-date :myproject.specs/localdate)
有哪些替代方案?