代码之家  ›  专栏  ›  技术社区  ›  bpereira

使用交换!而不是重置!在atom-clojure中

  •  1
  • bpereira  · 技术社区  · 6 年前

    如果我要执行此操作

    (def structure (atom [{:id "an-id"} {:id "another-id"}]))
    (def job {:type "some-job"})
    
    (reset! structure (map #(if (= "an-id" (:id %)) (update-in % [:performed-jobs] (fnil conj []) job) %) @structure))
    
    next structure:
    [{:id "an-id" :performed-jobs [{:type "some-job"}]} {:id "another-id"}]
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   Michiel Borkent    6 年前
    1. 代替 reset! 通过 swap! 通过给它一个函数,该函数接受 atom 并返回一个新值以存储在 原子
    2. 替换的取消引用 原子 使用函数的参数,旧值。

      (swap! structure
        (fn [old]
          (map #(if (= "an-id" (:id %))
                  (update-in % [:performed-jobs]
                             (fnil conj []) job) %)
                old)))