gpt4 book ai didi

Clojure 规范和记录构造函数

转载 作者:行者123 更新时间:2023-12-02 18:05:49 25 4
gpt4 key购买 nike

如果我定义了以下记录:

(defrecord Person [name id])

以及以下内容:

(s/def ::name string?)
(s/def ::id int?)
(s/def ::person (s/keys :req-un [::name ::id]))

如何确保您无法创建不符合::person 规范的 Person?换句话说,以下内容应该引发异常:

(->Person "Fred" "3")

我尝试过:

(s/fdef ->Person :ret ::person)

但是调用:

(->Person "Fred" "3")

不引发异常。

但是:

(s/conform ::person (->Person "Fred" "3"))

确实产生了预期的效果:

:clojure.spec/invalid

谢谢

最佳答案

fdef :ret 和 :fn 规范仅在 clojure.spec.test/check 期间检查测试,但您可以使用 fdef :args 规范在检测时检查构造函数的输入。

(s/fdef ->Person
:args (s/cat :name ::name :id ::id)
:ret ::person)

(require '[clojure.spec.test :as stest])
(stest/instrument `->Person)

(->Person "Fred" "3")

=> CompilerException clojure.lang.ExceptionInfo: Call to #'spec.examples.guide/->Person did not conform to spec:
In: [1] val: "3" fails spec: :spec.examples.guide/id at: [:args :id] predicate: int?
:clojure.spec/args ("Fred" "3")
:clojure.spec/failure :instrument
:clojure.spec.test/caller {:file "guide.clj", :line 709, :var-scope spec.examples.guide/eval3771}

使用匹配的规范对构造函数的 defrecord 和 fdef 进行宏组合并不会太困难。

关于Clojure 规范和记录构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38517839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com