【发布时间】:2019-09-19 01:30:01
【问题描述】:
我想知道是否有一种方法可以从一个命名空间更改另一个命名空间中的规范,并在后续规范中仍然保留修改后的规范的使用。用例是进行覆盖的命名空间想要创建一个 var nilable。
作为一个简化示例,假设核心命名空间具有以下规范:
(ns ns-test.core
(:require [clojure.spec.alpha :as s]))
(s/def ::string-spec string?)
(s/def ::string-vec (s/coll-of ::string-spec))
然后覆盖命名空间想要使用 ::string-vec 规范,但想要使单个元素可空字符串。当我以这种方式实现它时:
(ns ns-test.override
(:require [clojure.spec.alpha :as s]
[ns-test.core :as c]))
(prn "1" (s/valid? ::c/string-vec ["s"]))
(prn "2" (s/valid? ::c/string-vec [nil]))
(in-ns 'ns-test.core)
(s/def ::string-spec (s/nilable string?))
(in-ns 'ns-test.override)
(prn "3" (s/valid? ::c/string-vec ["s"]))
(prn "4" (s/valid? ::c/string-spec nil))
(prn "5" (s/valid? ::c/string-vec [nil]))
它改变了::c/string-spec,但没有改变::c/string-vec,我不想复制所有相关规范并重新定义它们,因为除了在许多其他地方使用的单个变量之外,它们并没有改变定义.
"1" true
"2" false
#namespace[ns-test.core]
:ns-test.core/string-spec
#namespace[ns-test.override]
"3" true
"4" true
"5" false
有没有办法做到这一点?
【问题讨论】:
标签: clojure clojure.spec