1

我正在更新 Clojure 中地图参考中的计数器。

(defn increment-key [this key]
    (dosync
        (let [value (get @this key)]
            (if (= value nil)
                (alter this assoc key (ref 1))
                (alter this assoc key (alter value inc))))))

但是,看起来 alter value inc 语句正在丢失引用:

(defn -main [& args]
    (def my-map (ref {}))
    (increment-key my-map "yellow")
    (println my-map)
    (increment-key my-map "yellow")
    (println my-map))

哪个打印:

$ lein run
#<Ref@65dcc2a3: {yellow #<Ref@3e0d1329: 1>}>  
#<Ref@65dcc2a3: {yellow 2}>

在这种情况下,如何在更新参考时保持相同的参考?

4

1 回答 1

3

你快到了。下面是解决方案,检查最后一行increment-key,您只需要更改值(不要像您所做的那样更改地图中的键,因为这导致键被更新为您的示例中的更改返回值2,记住alter返回ref的新值,而不是ref本身)。也不要在 def 中使用 def,你应该使用 let(在你的 -main 函数中)

(defn increment-key [this key]
    (dosync
        (let [value (get @this key)]
            (if (= value nil)
                (alter this assoc key (ref 1))
                (alter value inc)))))

(defn -main [& args]
  (let [my-map (ref {})]
       (increment-key my-map "yellow")
       (println my-map)
       (increment-key my-map "yellow")
       (println my-map)))
于 2013-04-14T09:19:55.583 回答