loops - 无法通过逐个元素循环来更新向量

标签 loops vector clojure

我正在尝试通过循环将向量的每个元素设置为等于 3。我得到:

java.lang.ClassCastException: clojure.lang.PersistentVector 可以
不被强制转换为 java.lang.Number

这是代码。

(def w [1 2 3])
(defn update [index value]
  (assoc w index value))

(loop [i -1]
  (if (< (count w) i)
    w
    (recur (update (+ i 1) 3))))

最佳答案

您的更新功能无法按您预期的方式工作。

(assoc w index value)

基于 w 生成一个新向量,除了 index 处的元素现在是 value。它不会改变 w .
user> (def w [1 2 3])
user> (assoc w 0 9)
    [9 2 3]
user> w
    [1 2 3]

此外,您没有正确使用循环/递归。您从 i 绑定(bind)到 -1 开始循环,打算将其用作 w 的索引,但 recur 不是使用 i 的下一个值调用循环,而是使用 update 返回的 w 的更改副本。

尝试更多类似的东西:
(def w [1 2 3])
(loop [i 0, v w]
    (if (< (count w) i)
        v
        (recur (inc i) (assoc v i 3))))

但是,由于您实际上并未使用索引来计算元素的新值,因此您可以使用 map 而不是循环。由于只是将每个元素设置为常量值而不考虑其旧值,因此您可以不断使用 clojure 的内置函数。
(vec (map (constantly 3) w))

Map 返回一个序列,我将其包装在对 vec 的调用中,以将其转换回向量。

关于loops - 无法通过逐个元素循环来更新向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594641/

相关文章:

javascript - 让 LightTable 显示 javascript 对象详细信息

python - 如何从 Raw_Input 字符串值创建循环

c - 如何使用 NDK 在 ARM 内联汇编中执行简单循环?

java - 使用位数查找给定范围之间的回文数

c++ - 用固定数字池中的随机唯一整数填充 vector

java - 如何在 Java 中更改 CLASSPATH?

python - 'for' 循环中的 i = i + 1 和 i += 1 有什么区别?

Java Programming for the Absolute Beginner 中列出的 Java 挑战

c++ - 当我返回其引用时,如果超出范围,静态 std::vector 将取消

clojure - java.io.FileNotFoundException : Could not locate clojure/spec/alpha__init. 类或类路径上的 clojure/spec/alpha.clj