关于"Programming Clojure",有一个在向量上使用get函数的例子:
(get [:a :b :c] 1)
-> :b
Run Code Online (Sandbox Code Playgroud)
我调用了(doc get),看起来get函数将hashmap作为参数而不是vector,所以如果vector是某种hashmap,我就会徘徊.我记得一个hashmap可以取一个索引整数,并返回与该索引匹配的值,所以我这样做是为了看看vector是否可以做同样的事情:
([1 2 3 4] 1)
-> 2
Run Code Online (Sandbox Code Playgroud)
它确实返回值2,它在[1 2 3 4]中的索引1处.
这是否意味着vector是一个hashmap,其键值对是索引值对?
不,底层实现是不同的.
话虽如此,由于逻辑矢量确实将索引映射到元素,它们是Clojure中的关联结构并且可以与之一起使用get
,contains?
并且assoc
(尽管对于assoc
仅使用从矢量末尾开始的0到1的索引).它们不能用于dissoc
- 这是一个"真实地图"操作.
此外,当用作函数时,向量对映射的作用不同:将map作为函数调用等效于使用它get
,而调用向量等同于使用nth
.不同之处在于nth
抛出索引越界(以及不可能是索引的参数,例如负数或非数字)的异常,而get
返回nil
.