在Clojure中,是一个特定的hashmap向量?

时间:2013-06-02 03:20:21

标签: clojure

在“Programming Clojure”中,有一个在向量上使用get函数的例子:

(get [:a :b :c] 1)
-> :b

我调用了(doc get),看起来get函数将hashmap作为参数但不是vector,所以如果vector是某种hashmap,我就会徘徊。我记得一个hashmap可以取一个索引整数,并返回与该索引匹配的值,所以我这样做是为了看看vector是否可以做同样的事情:

([1 2 3 4] 1)
-> 2

它返回值2,它在[1 2 3 4]中的索引1处。

这是否意味着vector是一个hashmap,其键值对是索引值对?

1 个答案:

答案 0 :(得分:8)

不,底层实现是不同的。

话虽如此,由于逻辑向量确实将索引映射到元素,它们是Clojure中的关联结构,可以与getcontains?assoc一起使用(尽管{{1}只能使用在向量末尾之后从0到1的索引)。它们不能与assoc一起使用 - 这是一个“真实地图”操作。

此外,当用作函数时,向量对映射的行为不同:将映射作为函数调用等效于将其与dissoc一起使用,而调用向量等同于使用get。区别在于nth在索引越界(以及不可能是索引的参数,例如负数或非数字)上抛出异常,而nth返回{ {1}}。