PersistentVector无法转换为IAtom类

问题描述 投票:0回答:1

我有一个局部变量,必须将一些文本存储为列表/向量。

我想根据某些条件向这些向量添加值,所以我想做的就是向该向量添加值,最后得到该向量的更新版本

但是当我尝试使用!swap时,总是会出现错误。

我尝试了这两个选项:

(do
  (let
    [error-list ()]
    (println (conj error-list "test"))
    (swap! error-list conj "test2")))

结果:(测试)线程“主”中的异常java.lang.ClassCastException:类clojure.lang.PersistentVector无法转换为类clojure.lang.IAtom(clojure.lang.PersistentVector和clojure.lang.IAtom位于加载程序的未命名模块中'app']

和:

(do
  (let
    [error-list []]
    (println (conj error-list "test"))
    (swap! error-list conj "test2")))

结果:[测试]线程“主”中的异常java.lang.ClassCastException:类clojure.lang.PersistentList $ EmptyList无法转换为类clojure.lang.IAtom(clojure.lang.PersistentList $ EmptyList和clojure.lang.IAtom位于加载程序“ app”的未命名模块)

clojure
1个回答
0
投票

这不是局部变量,这是一个let绑定。您已将名称错误列表绑定到第一个代码段中的值'(),第二个代码段中的值[]。

swap!是用于更新原子值的函数。您没有原子,您(第一个代码段)有一个列表,而(第二个代码段)有一个向量。您可以使用atom函数将其中任何一个包装在Atom中以允许可变状态。

(do
  (let
    [error-list (atom [])]
    (println (swap! error-list conj "test"))
    (swap! error-list conj "test2")
    @error-list))
[test]
["test" "test2"]
user=>
© www.soinside.com 2019 - 2024. All rights reserved.