欢迎!请参阅 关于 页面以了解此功能的更多信息。
此语句返回 nil(从 Clojure REPL 执行时) ({"a" 1} :a)
({"a" 1} :a)
...但是这会抛出 ClassCastException ((sorted-map "a" 1) :a)
ClassCastException
((sorted-map "a" 1) :a)
这是预期行为吗?
这很容易得到合理的解释,但您可能无法从文档中猜出。
事实上,在 Java 中也会发生相同的事情
(get (java.util.TreeMap. {"a" 1}) :a)
有序映射显然涉及比较器,但 sorted-map 的文档中没有说明如果未指定,您会得到哪种比较器。您可能可以从堆栈跟踪中得知,异常是由默认比较器 compare 引发的。
compare
(compare "a" :a)
有关详细信息,请参阅 https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/compare。这是一个权宜之计的默认选择,因为宿主的对象系统参与了比较,但 Java 的 Comparable 要求兼容的参数。
Comparable
简而言之,您可以为 sorted-map-by 提供自己(更加宽容的)比较器,或者保护查找过程。您自己的比较器可以是任何两个参数的函数,因此这很容易做到,但会比保护查找过程更加频繁地进行类型检查。
预期情况: https://clojure.atlassian.net/browse/CLJ-2693