首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >习惯的交换方式!或使用数据体进行更新。

习惯的交换方式!或使用数据体进行更新。
EN

Stack Overflow用户
提问于 2014-06-08 13:14:11
回答 1查看 137关注 0票数 1

如果我使用Clojure原子来记帐某事(例如选票),我可以这样做:

代码语言:javascript
复制
(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巧妙地转换给定键的值,而不必先查找它。

我怎样才能在数据通信中做到这一点呢?我可以这样做..。

代码语言:javascript
复制
(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)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-08 15:19:04

在我看来,最惯用的做法是记录投票的事实,然后在你想知道总数时进行计数查询。根据您的应用程序的需要,这种方法支持诸如检查双票、更改/撤回选票、在过去24小时内进行计数、.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24106521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档