欢迎!有关如何操作,请参阅关于页面了解更多信息。
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 的 bug,未检查函数对象的类名是否符合预期模式(所有多重方法都只会报告 clojure.lang.MultiFn)。
此问题已在 spec 2 中修复(依靠符号规范,而不尝试以这种方式解释函数对象)。