如何在Clojure中更新向量中的项目?

22

如果我有一个向量:

[1 2 3 4 5 6 7 8 9]

:我希望用 0 替换 5,得到:

[1 2 3 4 0 6 7 8 9]

当我只知道索引为4时,我该如何做到这一点?

类似于:

 (replace-in-vec [1 2 3 4 5 6 7 8 9] 4 0)
2个回答

45

assoc也可以用于向量!

 Usage: (assoc map key val)
        (assoc map key val & kvs)

在Map中使用assoc[iate]函数会返回一个相同类型(哈希/排序)的新Map,其中包含关键词与对应值的映射。在向量中使用该函数,会返回一个新的向量,其中指定的索引位置包含val。注意-索引必须小于等于(count vector)。

(assoc [1 2 3] 1 :a)
 => [1 :a 3]

3
还有一个函数叫做update-in: (update-in v [4] -5)。当然,如果你只是想把五重置为零,这个例子显得有点愚蠢。但是如果零是基于五进行计算得到的结果,比如移动坐标等,那么这个函数就非常方便了。 - kotarak
8
另一个提示:你也可以使用 assoc 向向量中添加元素。(assoc [:a :b] 2 :c) 会返回 [:a :b :c] - kotarak


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