Clojure Spec и разрушение? - PullRequest
       7

Clojure Spec и разрушение?

0 голосов
/ 07 июня 2018

Не уверен, как написать спецификацию для проверки деструктурированных аргументов функции.

Если у меня есть эта простая функция:

(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",

(...)

Как написать функцию Spec, используя ::vstring2?Или я?

Спасибо.

1 Ответ

0 голосов
/ 07 июня 2018

Вам просто нужно указать другую спецификацию для аргументов вашей функции, например, используя s/cat:

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

В вашем примере спецификация :args ожидает два аргумента, потому что ваша спецификация ::vstring2 являетсяКоллекция ожидает две строки.С этим изменением функция :args spec знает, что она принимает только один аргумент, который должен соответствовать ::vstring2.

Есть еще несколько примеров спецификаций функций здесь и здесь .

...