2024 Clojure 状态调查中分享您的想法!

欢迎!请查看关于页面获取更多的信息。

+1
Clojure

此语句返回 nil(从 Clojure REPL 执行时)
({"a" 1} :a)

...但会抛出ClassCastException
((sorted-map "a" 1) :a)

这是预期行为吗?

2 答案

+1

这很容易理解,但您可能不会从文档中猜到。

实际上,在 Java 中也会发生相同的情况

(get (java.util.TreeMap. {"a" 1}) :a)

显然,有序映射涉及比较器,但 sorted-map 的文档没有说明如果您不指定,则会获得什么类型的比较器。您可能可以从堆栈跟踪中得知异常是由默认比较器引发的,该比较器是 compare

(compare "a" :a)

该比较器在https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/compare有描述。它是一个便利的默认选择,因为主机对象系统参与其中,但 Java 的 Comparable 需要兼容的参数。

简要来说,您可以为 sorted-map-by 提供自己的(更宽容的)比较器,或者保护查找。您自己的比较器可以是任何两个参数的函数,因此很容易实现,但将比保护查找更频繁地产生类型检查的开销。

0

预期结果:[https://clojure.atlassian.net/browse/CLJ-2693](https://clojure.atlassian.net/browse/CLJ-2693)

...