最近遇到了一些关于sorted-set
的有趣行为。例如,对于正常的set
,当元素不存在时,返回值是nil
。然而,在sorted-set
中,如果比较器无法优雅地处理类型,调用将抛出异常。这个原因是合理的(比较器需要能够合理地比较元素),但是由于我们知道如果元素类型无法通过默认比较器进行比较,则该元素不在集中,因此在“无成员”情况下的接口略显困惑。
换句话说,我猜我是在建议,对于使用默认比较器的排序集,当类型无法比较时,应该有其合理的默认行为nil
而不是抛出异常,以便允许使用nil
进行pivot。
以示例来说,这种情况是在将形式传递到关键字函数(:foobar form)
时遇到的,它允许大量其他集合使用pivot,以下是一个小例子
`
user> (def normal #{"0000"})
;; => #'user/normal
user> (def sorted-version (sorted-set "0000"))
;; => #'user/sorted-version
user> normal
;; => #{"0000"}
user> sorted-version
;; => #{"0000"}
user> (:foobar normal)
;; => nil
user> (:foobar sorted-version)
执行错误(ClassCastException)
在用户/eval246355(form-init59552761865518221.clj:8123)中
`
class java.lang.String不能转换成class clojure.lang.Keyword(java.lang.String位于模块java.base的loader'bootstrap'中;clojure.lang.Keyword位于loader'app'的匿名模块中)
我认为我处理此问题的选择是try/catch或编写自定义比较器,两者都有些不寻常:)(face with smile)