clojure - 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”的未命名模块中)
解决方案
那不是局部变量,而是 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=>
推荐阅读
- java - 将一个进程的输出链接到另一个进程的输入
- python - 用于关闭 RDS 的 boto3 lambda 脚本不起作用
- node.js - 在使用基于 OAuth 流的身份验证的服务中验证来自后端以及来自客户端的请求
- python - 在python数据类中解码json时将“null”转换为np.nan
- plsql - 如何将测试引用到 utPLSQL 中的源/测试文件?
- babeljs - 使用 rollup 和 babel 转译特定的 `node_modules` 包
- ios - 如何将 Siri 与 Flutter 应用程序集成?
- google-colaboratory - 如何使用 wget 在 google colab 上下载共享项目?
- javascript - “组件”未定义 react/jsx-no-undef
- mysql - 动态构建带有Node错误的sql语句