Clojure 区别于;原子交换&引用;及;参考“通勤”;
两者之间有什么区别 一, 二,Clojure 区别于;原子交换&引用;及;参考“通勤”;,clojure,Clojure,两者之间有什么区别 一, 二, 这两个例子同样有效如果你只有一个ref和一个原子,实际上没有什么大的区别。我想你可能会学到一些关于原子和参考的区别 communion是一个可以在dosync块中的任何位置调用的函数。Clojure自己选择何时在此块内执行通勤 也许我可以用一个小例子来解释: (def x (ref 0)) (def y (ref 0)) (dosync (alter x inc) (alter y dec)) alter更改dosync块中ref的值。因为参考是
这两个例子同样有效如果你只有一个ref和一个原子,实际上没有什么大的区别。我想你可能会学到一些关于原子和参考的区别
communion
是一个可以在dosync
块中的任何位置调用的函数。Clojure自己选择何时在此块内执行通勤
也许我可以用一个小例子来解释:
(def x (ref 0))
(def y (ref 0))
(dosync (alter x inc)
(alter y dec))
alter
更改dosync
块中ref的值。因为参考是协调和同步的,所以我们需要将它们放在这个块中。如果在更改其中一个引用时出现错误,则整个块将失败,并且您的引用的值与调用更改之前的值相同
通勤的区别如下:如果我们有以下代码块
(def x (ref 0))
(def y (ref 0))
(dosync (commute x inc)
(alter y dec))
如果在这里更改ref值时发生错误,comment
仍会被调用,它会更改ref。它不关心alter
的结果,即使alter
失败,comment
也会增加x。
Clojure可以选择何时调用Communion,因此即使发生错误也可以执行它
与原子的最大区别在于原子是不协调的。如果有多个交换代码>在一个原子上,可能只是第一次交换代码>将被执行。我的一个项目在这个问题上卡住了,我必须确保第一次交换代码>在下一次交换之前已终止代码>被调用
所以再说一遍:想想你真正需要什么。你需要一个原子还是一些参考?如果您选择REF,您可以在alter
和communion
之间进行选择,前者在您希望的位置执行,后者在Clojure可以决定何时调用它的位置执行(调用是可交换的)
如果选择一个原子,则在执行该原子时只能更改一个值。如果另一个呼叫尝试交换代码>该值,将被拒绝 这个问题的前提是错误的,通勤
在对atom调用时将抛出异常。也许你想知道alter
和communion
之间的区别?如果答案是肯定的:如果你想知道变量、参考值、原子和代理之间的区别,我推荐。如果您想知道如何更改ref,我建议您。如果您想了解原子,我建议您,然后重新表述您的问题。@noisesmith抱歉,参考第一个示例希望本主题对您有所帮助:
(def x (ref 0))
(def y (ref 0))
(dosync (alter x inc)
(alter y dec))
(def x (ref 0))
(def y (ref 0))
(dosync (commute x inc)
(alter y dec))