【发布时间】:2011-06-27 07:45:41
【问题描述】:
在 Clojure 中设置 ref 值的 3 种方式有什么区别?我已经多次阅读有关 ref-set、commute 和 alter 的文档。我很困惑在什么时候使用哪些。谁能给我简要说明一下这些区别是什么以及为什么需要它们?
【问题讨论】:
标签: clojure
在 Clojure 中设置 ref 值的 3 种方式有什么区别?我已经多次阅读有关 ref-set、commute 和 alter 的文档。我很困惑在什么时候使用哪些。谁能给我简要说明一下这些区别是什么以及为什么需要它们?
【问题讨论】:
标签: clojure
作为对软件事务内存系统如何在 clojure 中工作的超级简单的解释;它重试事务,直到每个人都通过而没有从它下面改变它的值。您可以通过使用 ref-changeing-functions 来帮助它做出这个决定,这些函数会提示它在事务之间的哪些交互是安全的。
ref-set 适用于您不关心当前值的情况。 只需将其设置为这个! ref-set 为您节省了编写类似 (alter my-ref (fun [_] 4)) 之类的内容的焦虑,只是将 my-ref 的值设置为 4。(ref-set my-ref 4) 确实看起来好多了:)。
使用 ref-set 来简单设置值。
alter是最普通的标准。使用此功能更改值。这是STM的肉。它使用您传递的函数来更改值,如果它不能保证从事务开始时值没有改变,它会重试。这是非常安全的,即使在某些情况下您不需要它是安全的,例如递增计数器。
您可能大部分时间都想使用alter。
commute 是 alter 的优化版本,适用于那些事情的顺序真的无关紧要的时代。谁向计数器添加了哪个+1没有区别。结果是一样的。如果 STM 正在决定您的事务是否可以安全提交,并且它仅在通勤操作上存在冲突而在更改操作上没有冲突,那么它可以继续提交新值而无需重新启动任何人。这可以节省偶尔的事务重试,尽管您不会在普通代码中看到巨大的收益。
尽可能使用commute。 p>
【讨论】: