在“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,其键值对是索引值对?
答案 0 :(得分:8)
不,底层实现是不同的。
话虽如此,由于逻辑向量确实将索引映射到元素,它们是Clojure中的关联结构,可以与get
,contains?
和assoc
一起使用(尽管{{1}只能使用在向量末尾之后从0到1的索引)。它们不能与assoc
一起使用 - 这是一个“真实地图”操作。
此外,当用作函数时,向量对映射的行为不同:将映射作为函数调用等效于将其与dissoc
一起使用,而调用向量等同于使用get
。区别在于nth
在索引越界(以及不可能是索引的参数,例如负数或非数字)上抛出异常,而nth
返回{ {1}}。