欢迎!请查看 关于 页面了解更多关于如何使用本网站的详细信息。
clj Clojure 1.10.1 user=> (defmulti valid? (fn [x] (odd? x))) #'user/valid? user=> (defmethod valid? true [x] true) #object[clojure.lang.MultiFn 0x184545fe "clojure.lang.MultiFn@184545fe"] user=> (require '[clojure.spec.alpha :as s]) nil user=> (s/def ::foo (s/and int? valid?)) :user/foo user=> (s/conform ::foo 5) 5 user=> (s/unform ::foo 5) Execution error (NullPointerException) at java.util.regex.Matcher/getTextLength (Matcher.java:1770). null user=> (pst *e) NullPointerException java.util.regex.Matcher.getTextLength (Matcher.java:1770) java.util.regex.Matcher.reset (Matcher.java:416) java.util.regex.Matcher.<init> (Matcher.java:253) java.util.regex.Pattern.matcher (Pattern.java:1134) clojure.lang.Compiler.demunge (Compiler.java:2936) clojure.spec.alpha/fn-sym (alpha.clj:128) clojure.spec.alpha/fn-sym (alpha.clj:124) clojure.spec.alpha/fn--1809 (alpha.clj:145) clojure.spec.alpha/fn--1809 (alpha.clj:130) clojure.spec.alpha/fn--1782/G--1777--1791 (alpha.clj:121) clojure.spec.alpha/specize (alpha.clj:152) clojure.spec.alpha/specize (alpha.clj:151)
是的,spec 中确实有一个错误,没有检查函数对象的类名是否符合预期的模式(所有多方法将仅报告 clojure.lang.MultiFn)。
这已在 spec 2 中修复(仅依赖于符号规范,完全不尝试解释此类函数对象)。