Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 区别于;原子交换&引用;及;参考“通勤”;_Clojure - Fatal编程技术网

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))