17
在我看來,with-redefs
可以做到binding
爲動態符號所能做的所有事情,只是它不具備需要^:dynamic
元數據的限制。那麼我應該什麼時候使用一個呢?當你不需要定義某些動態的東西來重新定義它時,將某些東西定義爲動態的意義是什麼?
在我看來,with-redefs
可以做到binding
爲動態符號所能做的所有事情,只是它不具備需要^:dynamic
元數據的限制。那麼我應該什麼時候使用一個呢?當你不需要定義某些動態的東西來重新定義它時,將某些東西定義爲動態的意義是什麼?
除要求^:dynamic
元數據外,binding
還創建僅在當前線程中可見的綁定,而with-redefs
所做的綁定在所有線程中都可見。所以,with-redefs
是一個非常鈍的工具,並有可能影響在同一虛擬機上運行的其他代碼。我從來沒有見過在測試代碼之外使用with-redefs
,也不應該(至少在我看來)。
我會總結兩成這樣的區別:
聲明一個var當成^:dynamic
,使用耳罩命名動態VAR(如*my-dynamic-var*
)的約定一起,有額外的好處,它是廣告的自記錄的方式來調用者,你的那部分代碼可以動態修改。
總結:更喜歡^:動態和綁定當寫入API和生產代碼。在測試中使用和-rewfs,並作爲動態改變超出您的控制範圍而未聲明爲^:dynamic
(然後謹慎使用)的變量的行爲的最後手段。
很好的答案。我已經看到了耳罩的命名規則,我不明白它的含義。我是否應該在動態的函數上使用該命名約定,或者僅僅使用原始值? –
我從未在公共API中看到'defn'函數的耳罩。對於一個動態綁定的函數,我會沿着這些線做一些事情:https://gist.github.com/alexhall/5286484 – Alex
這很有道理。儘管當我瀏覽clj-http項目時,它並沒有這樣做。它把動態放在了defn上。 –