是否可以选择在Clojure中为符号赋值,然后重新分配相同的符号?我现在看到的是Clojure中的所有变量都是不变的。这样对吗?
答案 0 :(得分:6)
这些最后各有不同的特点和目的。
来自the above:
注意 - 您无法分配函数参数或本地绑定。只要 Java字段,Vars,Refs和Agent在Clojure中是可变的。
重新绑定本地名称的示例:
(let [coll (range)
coll (rest coll)
coll (filter odd? coll)
coll (take 5 coll)]
coll)
;(1 3 5 7 9)
答案 1 :(得分:2)
所有局部变量 - 无论是let
- 绑定还是fn
- 绑定(fn
参数) - 都是不变的,这是对的。 (它们就像数学变量一样,你可以评估它们在变量值的各种赋值下所涉及的表达式,但在任何单一的这种评估期间,指定的值必须保持不变。)
请注意,在嵌套范围内,这些本地人可以通过同名的本地人阴影;阴影局部可以有独立的值,但它们也不能重新分配。
还有一个独特的Vars概念 - 由def
形式最常引入的顶级对象。这些可以使其根值反弹,另外,如果标记为:dynamic
,则可以在本地反弹线程。
答案 2 :(得分:0)
这似乎遵循以下文档:http://funcool.github.io/clojurescript-unraveled/#state-management
cljs.user=> (def x (volatile! 2))
#'cljs.user/x
cljs.user=> x
#object [cljs.core.Volatile {:val 2}]
cljs.user=> (deref x)
2
cljs.user=> (vreset! x 5)
5
cljs.user=> x
#object [cljs.core.Volatile {:val 5}]
cljs.user=> (deref x)
5
但是,我发现所有关于"不可移动的东西"概念上不连贯。也许更有知识的人可以评论。