【问题标题】:Clojure Spec and destructuring?Clojure 规范和解构?
【发布时间】:2018-06-07 17:49:11
【问题描述】:

不确定如何编写 Spec 来检查函数的解构参数。

如果我有这个简单的功能:

(defn make-name [[first last]]
  (str first " " last))

我为这个论点写了这个规范:

(s/def ::vstring2 (s/coll-of string? :kind vector? :count 2 :distinct false))

它工作正常:

(s/conform ::vstring2 ["Rich" "Hickey"])
=> ["Rich" "Hickey"]

但是当我尝试将它应用到这样的函数时:

(s/fdef make-name
        :args ::vstring2
        :ret string?)

它爆炸了:

(stest/check `make-name)
=>
({:spec #object[clojure.spec.alpha$fspec_impl$reify__2451
                0x7dd4c5ac
                "clojure.spec.alpha$fspec_impl$reify__2451@7dd4c5ac"],
  :clojure.spec.test.check/ret {:result #error{:cause "Wrong number of args (2) passed to: roster/make-name",

(...)

如何使用 ::vstring2 编写函数 Spec?还是我?

谢谢。

【问题讨论】:

标签: clojure clojure.spec


【解决方案1】:

您只需为函数的参数指定另一个规范,例如使用s/cat:

(s/fdef make-name
  :args (s/cat :arg1 ::vstring2)
  :ret string?)

在您的示例中,:args 规范需要两个参数,因为您的 ::vstring2 规范是一个需要两个字符串的集合。通过此更改,函数 :args 规范知道它只需要 一个 参数,该参数应符合 ::vstring2

还有更多函数规范示例herehere

【讨论】:

  • 感谢您(再次!)帮助我,泰勒。我之前查看了您引用的两个示例,但没有看到任何让我想到添加 :arg1 位的内容。
猜你喜欢
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多