我有一个局部变量,必须将一些文本存储为列表/向量。
我想根据某些条件向这些向量添加值,所以我想做的就是向该向量添加值,最后得到该向量的更新版本
但是当我尝试使用!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”的未命名模块)
这不是局部变量,这是一个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=>