[英]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.