concurrency - 在以下 Clojure 代码中,alter 可以替换为 commute 吗?
问题描述
(def alice-height
(ref 3))
(def right-hand-bites
(ref 10))
(defn eat-from-right-hand []
(dosync
(when (pos? @right-hand-bites)
(alter right-hand-bites dec)
(alter alice-height #(+ % 24)))))
此代码来自 Living Clojure 一书。在书中,作者还举了一个将alter替换为commute的例子。我想知道pos?
一开始的测试,我们真的可以做这个替换吗?
解决方案
不,当递减不正确时替换alter
为。commute
right-hand-bites
条件句的意图显然是为了防止right-hand-bites
变成否定的。right-hand-bites
只有在交易结束前不会改变的假设下,减量才有效。虽然 likealter
有commute
自己的 ref 世界快照视图,但它会在提交时重新读取 commute 函数并将其重新应用到 ref ,这在该程序中将是一个错误。
因此,commute
可以将负值提交给right-hand-bites
.
要么坚持使用alter
,要么使用ensure
代替@
(尽管这使得整个通勤练习变得毫无意义)。
推荐阅读
- c# - 无法将网格绑定到视图模型 - 网格中不显示任何数据
- javascript - How to use toDate() on Firestore.FieldValue.Timestamp?
- docker - 需要一些 docker run 参数
- sql - WHEN 与 INSERT 语句匹配
- python - Heroku build 卡在 Building Source for Simple Python Flask App
- javascript - 每次打开我的谷歌表格时,如何为特定单元格设置时间戳?
- java - 'Else' 是我的 Java 代码中的一个意外标记,我得到的错误是第 18 行的非法类型。我的代码有什么问题?
- node.js - 加入链式承诺?
- bash - 我可以在没有多线程的情况下在 bash 中隧道 TLS 流量吗?
- jenkins - 如何使用 Jenkins 参数将值替换为属性文件