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
...