clojure.set/intersection,按照意图和文档,旨在在两个集合之间进行操作。然而,它有时允许(并在非集合参数上返回正确操作)非集合参数。这让人混淆了非集合参数不应使用的意图。
以下是一个使用Set与KeySeq的例子
如果存在交集,你会得到一个结果。这可能会导致编写代码的人认为这是可以的,或者没有注意到他们使用了不兼容的数据类型。但是,一旦交集为空,就会引发适当的类型错误,尽管这是偶然的,因为clojure.core/disj的第一个参数应该是集合。
user=> (require '[clojure.set :refer [intersection]])
nil
user=> (intersection #{:key_1 :key_2} (keys {:key_1 "na"})) ;这可行,但不应该
(:key_1)
user=> (intersection #{:key_1 :key_2} (keys {:key_3 "na"})) ;这失败了,因为intersection假设第二个参数是Set
ClassCastException clojure.lang.APersistentMap$KeySeq无法转换为clojure.lang.IPersistentSet clojure.core/disj (core.clj:1449)
(disj (keys {:key_1 "na"}) #{:key_1 :key_2}) ;intersection所假设的
ClassCastException clojure.lang.APersistentMap$KeySeq无法转换为clojure.lang.IPersistentSet clojure.core/disj (core.clj:1449)
在一个旨在特定类型的库上强制类型安全似乎是一个负责任的做法。它防止了错误代码在不知情的情况下被视为正确,直到正确的数据出现以踩中陷阱。