clojure.set/intersection 似乎使用了向量的索引作为值。如果在其中一个参数中意外传递了向量,这将导致非常奇怪的行行为。
`
ti.repl-init=> (clojure.set/intersection #{0 1} [2 2 2 2 2])
{0 1}
ti.repl-init=> (clojure.set/intersection [2 2 2 2] #{0 1})
{0 1}
ti.repl-init=> (clojure.set/intersection [0 1] [2 2 2 2])
[0 1]
ti.repl-init=> (clojure.set/intersection [2 2 2 2] [2 2 2 2])
[2 2 2 2]
ti.repl-init=> (clojure.set/intersection [3 3 3 ] [2 2 2 2])
[3 3 3]
ti.repl-init=> (clojure.set/intersection [55] [2 2 2 2])
ClassCastException clojure.lang.PersistentVector 不能被转换到 clojure.lang.IPersistentSet clojure.core/disj (core.clj:1476)
`
如果任何参数是列表,你会得到一个 ClassCastException,这可能没有我们希望的那样明确。
`
ti.repl-init=> (clojure.set/intersection #{0 1} (list 2 2 2 2))
IllegalArgumentException 不支持在类型 clojure.lang.PersistentList 上使用 contains? clojure.lang.RT.contains (RT.java:814)
`
如果所有参数都是列表,也会发生相同的情况