簡體   English   中英

Clojure:綁定與with-redefs

[英]Clojure: binding vs. with-redefs

clojure.core具有宏綁定with-redefs 看看關於clojuredocs.org的文檔字符串和示例,它們似乎做了非常相似的事情。 有什么區別,我應該在哪些情況下使用哪一個?

Clojure Vars可以有線程局部綁定。 binding使用這些,而with-redefs實際上改變了var的根綁定(有點像默認值)。

另一個區別是binding僅適用於:dynamic變量,而with-redefs適用於所有變量。

例子:

user=> (def ^:dynamic *a* 1)
#'user/*a*
user=> (binding [*a* 2] *a*)
2
user=> (with-redefs [*a* 2] *a*)
2
user=> (binding [*a* 2] (doto (Thread. (fn [] (println "*a* is " *a*))) (.start) (.join)))
*a* is  1
#<Thread Thread[Thread-2,5,]>
user=> (with-redefs [*a* 2] (doto (Thread. (fn [] (println "*a* is " *a*))) (.start) (.join)))
*a* is  2
#<Thread Thread[Thread-3,5,]>

您可以使用(未​​記錄的) binding-conveyor-fn將線程局部綁定傳遞到新線程中:

user=> (binding [*a* 2] (doto (Thread. (#'clojure.core/binding-conveyor-fn (fn [] (println "*a* is " *a*)))) (.start) (.join)))
*a* is  2
#<Thread Thread[Thread-5,5,]>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM