Clojure中set和hash-set的区别是什么?

5

我在文档和网络上都找不到解释,为什么有两个不同的函数似乎做的事情几乎一样,除了一个接收集合,另一个接收参数列表(但这可以通过使用(apply hash-set coll)轻松解决)。

3个回答

1

我刚刚查看了sethash-set的源代码。你说得对,除了一个接受多个参数,另一个接受集合之外,实际上几乎没有区别。

顺便提一下,这是源代码:

set

hash-set


1
这只是为了方便。与 vectorvec 相同。但对于映射和列表来说并不完全相同。
(vector 0 1 2)            => [0 1 2]
(apply vector (range 3))  => [0 1 2]
(vec (range 3))           => [0 1 2]

(hash-set 0 1 2)            => #{0 1 2}
(apply hash-set (range 3))  => #{0 1 2}
(set (range 3))             => #{0 1 2}

(hash-map :a 1 :b 2)          => {:b 2, :a 1}
(apply hash-map [:a 1 :b 2])  => {:b 2, :a 1}
(into {} [[:a 1] [:b 2]])     => {:a 1, :b 2}

(list 0 1 2)            => (0 1 2)
(apply list (range 3))  => (0 1 2)
(into (list) (range 3)) => (2 1 0)  ; *** reversed order ***

1

因为我们可以用另一个来定义每个元素:

(defn hash-set [& args]
  (clojure.core/set args))

或者

(defn set [coll]
  (apply clojure.core/hash-set coll))

很可能两者是分别定义的,以提高速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接