在Clojure中设置ref值的3种方法有什么不同?我已经多次阅读过关于ref-set,commute和alter的文档。我很困惑哪些时候可以使用哪些。有人可以简要介绍一下这些差异是什么以及为什么需要这些差异吗?
答案 0 :(得分:87)
作为软件事务内存系统如何在clojure中工作的一个非常简单的解释;它会重试事务,直到他们每个人都通过,而不会从其下面更改其值。您可以通过使用ref-changing-functions来帮助它做出这个决定,这些函数可以提示交易之间哪些交互是安全的。
ref-set
适用于您不关心当前值的情况。 只需将其设为此即可! ref-set
(alter my-ref (fun [_] 4))
只是为了将my-ref的值设置为4 (ref-set my-ref 4)
,ref-set
会让你感到焦虑。alter
确实看起来好多了:)。
使用alter
只需设置值。
commute
是最正常的标准版。使用此功能可更改值。这是STM的核心。它使用您传递的函数来更改值并重试,如果它无法保证该值在事务开始时保持不变。这是非常安全的,即使在某些情况下你不需要它 安全,比如增加一个计数器。
您可能希望大多数时间都使用commute
。
{{1}} 是alter的优化版本,适用于事情顺序无关紧要的时间。没有区别是谁给柜台增加了+1。结果是一样的。如果STM决定您的事务是否可以安全提交并且它只在通勤操作上有冲突而在alter操作上没有冲突,则它可以继续并提交新值而无需重新启动任何人。这可以节省偶尔的事务重试,但是你不会在普通代码中看到巨大的增益。
尽可能使用{{1}}。