这很容易证明,但你可能无法从文档中猜到。
实际上,在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提供一个自己的(更具包容性的)比较器,或者保护你的查找。你的比较器可以是任何两个参数的函数,所以很容易做到,但这会带来更多类型检查的开销,而不是保护你的查找。