有没有更好的方法在 Clojure 中将事物构建为原子?

THX*_*137 1 clojure

为了建立一个数据结构,我发现自己做了很多事情,比如:

(let [foo (atom [])]
  (do
    (swap! foo conj {:foo "bar"})
    (swap! foo conj {:foo "baz"}))
  @foo)

=> [{:foo "bar"} {:foo "baz"}]
Run Code Online (Sandbox Code Playgroud)

这是一种反模式吗?我使用了很多原子。

Sea*_*eld 6

atom这里不需要。您可以使用不可变的数据结构:

(-> []
    (conj {:foo "bar"})
    (conj {:foo "baz"}))
;;=> [{:foo "bar"} {:foo "baz"}]
Run Code Online (Sandbox Code Playgroud)

对于来自 OOP 或命令式语言的人来说,这可能是最困难的转变:避免可变性。

  • 大多数 cljs 应用程序都有一个包含其“状态”的原子。 (3认同)