首页 > 解决方案 > PersistentVector 不能转换为 IAtom 类

问题描述

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

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

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

我已经尝试了这两个选项:

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

结果:(
测试)
线程“main”中的异常java.lang.ClassCastException:无法将类clojure.lang.PersistentVector强制转换为类clojure.lang.IAtom(clojure.lang.PersistentVector和clojure.lang.IAtom在未命名的模块中加载程序“应用程序”)

和:

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

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

标签: clojure

解决方案


那不是局部变量,而是 let 绑定。您已将名称 error-list 绑定到第一个片段中的值 '() 和第二个片段中的 [] 。

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=>

推荐阅读