如何在 ClojureScript 中创建函数局部可变变量?
How to create a function local mutable variable in ClojureScript?
考虑以下假设的荒谬 ClojureScript 函数:
(defn tmp []
(def p 0)
(set! p (inc p))
(set! p (inc p))
(set! p (inc p)))
在 REPL 中重复执行此函数会导致
3
6
9
etc.
是否可以创建一个函数本地的可变变量,这样输出就可以了
3
3
3
etc.
在重复执行 (tmp) 的情况下?
let
允许您分配限制在其范围内的变量:
(defn tmp[]
(let [p 0]
...))
现在,clojurescript 使用不可变数据。这意味着一切基本上都是一个常数,一旦你设置了一个 p
的值,就不会改变它。有两种方法可以解决这个问题:
使用更多局部变量
(defn tmp[]
(let [a 0
b (inc a)
c (inc b)
d (inc c)]
...))
使用 atom
原子与 clojurescript 中的其他数据结构有些不同,并且允许控制它们的状态。基本上,您可以将它们视为对您价值的参考。
创建原子时,将初始值作为参数传递。您可以通过在变量前面添加 @
来访问原子值,这实际上是 (deref my-var)
.
的宏
您可以使用 swap!
和 reset!
函数更改原子的值。在 cljs cheatsheet.
中了解更多信息
(defn tmp[]
(let [p (atom 0)]
(reset! p (inc @p))
(reset! p (inc @p))
(reset! p (inc @p))))
希望这对您有所帮助。
考虑以下假设的荒谬 ClojureScript 函数:
(defn tmp []
(def p 0)
(set! p (inc p))
(set! p (inc p))
(set! p (inc p)))
在 REPL 中重复执行此函数会导致
3
6
9
etc.
是否可以创建一个函数本地的可变变量,这样输出就可以了
3
3
3
etc.
在重复执行 (tmp) 的情况下?
let
允许您分配限制在其范围内的变量:
(defn tmp[]
(let [p 0]
...))
现在,clojurescript 使用不可变数据。这意味着一切基本上都是一个常数,一旦你设置了一个 p
的值,就不会改变它。有两种方法可以解决这个问题:
使用更多局部变量
(defn tmp[]
(let [a 0
b (inc a)
c (inc b)
d (inc c)]
...))
使用 atom
原子与 clojurescript 中的其他数据结构有些不同,并且允许控制它们的状态。基本上,您可以将它们视为对您价值的参考。
创建原子时,将初始值作为参数传递。您可以通过在变量前面添加 @
来访问原子值,这实际上是 (deref my-var)
.
您可以使用 swap!
和 reset!
函数更改原子的值。在 cljs cheatsheet.
(defn tmp[]
(let [p (atom 0)]
(reset! p (inc @p))
(reset! p (inc @p))
(reset! p (inc @p))))
希望这对您有所帮助。