我在sorted-set
中发现了一些有趣的行为。例如,对于正常的set
,当元素不存在时返回nil
。然而,对于sorted-set
,如果比较器没有友好地处理类型,则调用会抛出异常。这个原因是合理的(比较器需要能够正常比较元素),但由于我们知道如果元素的类型无法通过默认方式比较,则元素不在集合中,所以“不存在成员”的情况下的接口稍显困惑。
换句话说,我认为,对于使用默认比较器的sorted-set,应该在无法比较类型时返回nil
而不是抛出异常,以便允许nil技术。
例如,这个问题发生在将表单传递给关键字函数(:foobar form)
时,该函数允许对许多其他集合进行nil技术。以下是一个小片段
`
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)在user/eval246355(form-initialized59552761865518221.clj:8123)。
类java.lang.String无法转换为类clojure.lang.Keyword(java.lang.String位于模块java.base的加载器中;clojure.lang.Keyword位于未命名的模块加载器中)
`
我认为我处理这种问题的选择是try/catch或编写自定义比较器,两者似乎都有点奇怪:)
我可能遗漏了什么,但仍然认为这是有趣的:)