如果我使用Clojure原子来记帐某事(例如选票),我可以这样做:
(def votes (atom {}))
(defn vote! [candidate]
(swap! votes update-in [candidate] (fnil inc 0)))
(vote! "Abraham Lincoln")
(vote! "Abraham Lincoln")
(vote! "Winston Churchill")
votes ;=> {"Abraham Lincoln" 2, "Winston Churchill" 2}在这里,update-in巧妙地转换给定键的值,而不必先查找它。
我怎样才能在数据通信中做到这一点呢?我可以这样做..。
(defn vote! [db candidate]
(let [[e v] (first (q '[:find ?e ?v
:in $ ?candidate
:where [[?e :name ?candidate]
[?e :votes ?v]] db candidate)
(transact! conn [{:db/id e :votes (inc v)}]))但是它似乎有点麻烦,必须运行查询,返回值,然后处理新的值。是否有一种更惯用的方法(比如swap!或update-in)?
发布于 2014-06-08 15:19:04
在我看来,最惯用的做法是记录投票的事实,然后在你想知道总数时进行计数查询。根据您的应用程序的需要,这种方法支持诸如检查双票、更改/撤回选票、在过去24小时内进行计数、.
https://stackoverflow.com/questions/24106521
复制相似问题