-1

我在验证 clojure 棱柱模式时遇到问题。这是代码。

:Some_Var1 {:Some_Var2  s/Str
                  :Some_Var3 ( s/conditional
                        #(= "mytype1" (:type %)) s/Str
                        #(= "mytype2" (:type %)) s/Str
                  )}

我正在尝试使用以下代码对其进行验证:

"Some_Var1": {
    "Some_Var2": "string",
"Some_Var3": {"mytype1":{"type":"string"}}
  }

但它给我一个错误:

{
  "errors": {
    "Some_Var1": {
      "Some_Var3": "(not (some-matching-condition? a-clojure.lang.PersistentArrayMap))"
    }
  }
}

这是我要验证的非常基本的代码。我对clojure很陌生,仍在尝试学习它的基础知识。

谢谢,

4

1 回答 1

3

欢迎来到 Clojure!这是一门很棒的语言。

在 Clojure 中,关键字和字符串是不同的类型,即:type不相同"type"。例如:

user=> (:type  {"type" "string"})
nil
(:type  {:type "string"})
"string"

但是,我认为这里有一个更深层次的问题:从查看您的数据来看,您似乎想要对数据本身的类型信息进行编码,然后根据该信息进行检查。这可能是可能的,但这将是模式的非常高级的用法。当类型在类型之前已知时,通常使用模式,例如:

(require '[schema.core :as s])
(def data
  {:first-name "Bob"
   :address {:state "WA"
             :city "Seattle"}})

(def my-schema
  {:first-name s/Str
   :address {:state s/Str
             :city s/Str}})

(s/validate my-schema data)

我建议,如果您需要基于编码的类型信息进行验证,那么为此编写自定义函数可能会更容易。

希望有帮助!

更新:

一个如何conditional工作的例子,这是一个将验证的模式,但同样,这是模式的非惯用用法:

(s/validate
{:some-var3
(s/conditional
 ;; % is the value: {"mytype1" {"type" "string"}}
 ;; so if we want to check the "type", we need to first
 ;; access the "mytype1" key, then the "type" key
 #(= "string" (get-in % ["mytype1" "type"]))
 ;; if the above returns true, then the following schema will be used.
 ;; Here, I've just verified that
 ;; {"mytype1" {"type" "string"}}
 ;; is a map with key strings to any value, which isn't super useful
 {s/Str s/Any}
)}
{:some-var3 {"mytype1" {"type" "string"}}})

我希望这会有所帮助。

于 2016-05-17T03:14:31.827 回答