gpt4 book ai didi

clojure - 是什么导致了这个 NullPointerException?

转载 作者:行者123 更新时间:2023-12-02 12:03:27 25 4
gpt4 key购买 nike

我正在使用 Project Euler 问题来帮助我学习 clojure,但我遇到了一个我无法弄清楚的异常。 nillify 和change-all 定义在底部供引用。

(loop [the-vector (vec (range 100))
queue (list 2 3 5 7)]
(if queue
(recur (nillify the-vector (first queue)) (next queue))
the-vector))

这会引发 NullPointerException,我不明白为什么。我可以看到的代码中唯一可能抛出此类异常的部分是对 nillify 的调用,但在抛出异常之前,队列似乎并没有只剩下一个元素—— - 即使队列变空,这也是 if 语句的用途。

有什么想法吗?

“给定一个向量、一个值和一个索引列表,返回一个包含 @indice=value 的向量”

(defn change-all [the-vector indices val]
(apply assoc the-vector (interleave indices (repeat (count indices) val))))

“给定一个向量和一个 val,返回一个向量,其中索引等于 val 倍数的所有条目都被清零,但保持原始不变”

(defn nillify [coll val]
(change-all coll (range (* 2 val) (inc (last coll)) val) nil))

最佳答案

问题是

(inc (last coll))

您正在更改向量的内容,您不能再使用它来确定长度。相反:

(count coll)

就风格而言,请使用 let 绑定(bind):

(defn change-all [the-vector indices val]
(let [c (count indices)
s (interleave indices (repeat c val))]
(apply assoc the-vector s)))

(defn nillify [coll val]
(let [c (count coll)
r (range (* 2 val) c val)]
(change-all coll r nil)))

(loop [the-vector (vec (range 100))
[f & r] '(2 3 5 7)]
(if r
(recur (nillify the-vector f) r)
the-vector))

关于clojure - 是什么导致了这个 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4953678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com