ref-set vs commute vs alter
在Clojure中设置ref的三种方法有什么区别? 我已经多次阅读关于ref-set,commute和alter的文档。 我很困惑哪些在什么时候使用。 有人能为我提供一个简短的描述差异是什么,为什么每个都需要?
作为对软件事务内存系统如何在clojure中工作的一个超级简单的解释; 它会重试交易,直到每个人都能通过,而不会从其下面改变它的值。 你可以通过使用ref-changing-function来做出这个决定,这个函数给出了关于交易之间什么交互是安全的提示。
-
当你不关心当前值的时候,
ref-set
是用来ref-set
。 只要把它设置为这个 !ref-set
可以节省你编写类似的东西(alter my-ref (fun [_] 4))
,把my-ref的值设置为4.(ref-set my-ref 4)
更好:)。
使用ref-set
来简单地设置值。 -
alter
是最正常的标准之一。 使用此function来更改值。 这是STM的肉。 它使用您传递的函数来更改该值,并且如果无法保证该值从事务开始时不变,则重试。 这是非常安全的,即使在某些情况下,你不需要它是安全的,如增加一个柜台。 你大概要在大部分时间使用alter
。 -
commute
是一个优化版本的改变那些时候,事情的顺序真的没有关系。 是谁给计数器增加了+1,没有区别。 结果是一样的。 如果STM正在决定你的事务是否可以安全地提交,并且它只在通勤操作上有冲突而在alter操作上只有冲突,那么它可以继续并提交新的值而不必重启任何人。 这可以节省偶尔的交易重试,虽然你不会看到在正常的代码从这个巨大的收益。
commute
使用commute
。