6

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

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

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

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

它确实返回了值 2,它位于 [1 2 3 4] 中的索引 1 处。

这是否意味着向量是哈希图,其键值对是索引值对?

4

1 回答 1

8

不,底层实现不同。

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

此外,向量在用作函数时与映射的作用不同:将映射作为函数调用等同于使用它get,而调用向量等同于使用nth。不同之处在于,nth在 index-out-of-bounds (以及不可能是索引的参数,例如负数或非数字)上引发异常,而get返回nil.

于 2013-06-02T03:25:51.277 回答