欢迎!请查看关于页面获取更多的信息。
此语句返回 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](https://clojure.atlassian.net/browse/CLJ-2693)