小编Mar*_*ůda的帖子

使用 Clojure 规范测试 java.time.LocalDate 的有效实例

我正在尝试使用 Clojure Spec 来定义包含 java.time.LocalDate 元素的数据结构:

(s/def :ex/first-name string?)
(s/def :ex/last-name string?)
(s/def :ex/birth-date (s/valid? inst? (java.time.LocalDate/now)))

(s/def :ex/person
  (s/keys :req [:ex/first-name
                :ex/last-name
                :ex/birth-date]))

(def p1 #:ex{:first-name "Jenny"
             :last-name  "Barnes"
             :birth-date (java.time.LocalDate/parse "1910-03-15")})

(println p1)
Run Code Online (Sandbox Code Playgroud)

产生以下输出

#:ex{:first-name Jenny, :last-name Barnes, :birth-date #object[java.time.LocalDate 0x4ed4f9db 1910-03-15]}
Run Code Online (Sandbox Code Playgroud)

但是,当我测试 p1 是否符合 :ex/person 规范时,它失败了:

(s/valid? :ex/person p1)
ClassCastException java.lang.Boolean cannot be cast to clojure.lang.IFn  clojure.spec.alpha/spec-impl/reify--1987 (alpha.clj:875)
Run Code Online (Sandbox Code Playgroud)

仔细看看Clojure 示例吗?, 我懂了:

(inst? (java.time.Instant/now))
;;=> true
(inst? (java.time.LocalDateTime/now))
;;=> false
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到返回 false 的明显原因。这似乎是我的问题的根源,但我还没有找到解决方案,需要一些帮助。

clojure clojure.spec

1
推荐指数
1
解决办法
636
查看次数

标签 统计

clojure ×1

clojure.spec ×1