【问题标题】:Overriding Clojure spec in a different namespace在不同的命名空间中覆盖 Clojure 规范
【发布时间】: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


    【解决方案1】:

    这种行为与命名空间无关 规范不应在运行时更改。 如果您需要在 repl 进行更改,则需要重新加载/重新定义所有规范。

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多