在我看来,with-redefs
可以执行动态符号binding
可以执行的所有操作,只是它没有需要^:dynamic
元数据的限制。那我什么时候应该使用另一个呢?
答案 0 :(得分:17)
除了要求^:dynamic
元数据之外,binding
还创建仅在当前线程中可见的绑定,而with-redefs
所做的绑定在所有线程中都可见。因此,with-redefs
是一个非常生硬的工具,有可能影响在同一个VM中运行的其他代码。我从来没有见过with-redefs
在测试代码之外使用,也不应该(至少在我看来)。
我会总结两者之间的差异:
将var声明为^:dynamic
,以及使用耳罩命名动态变量(例如*my-dynamic-var*
)的惯例,还有一个额外的好处,即它是一种自我记录的向呼叫者做广告的方式您的部分代码可以动态修改。
总结:在编写API和生产代码时,首选 ^:动态和绑定。在测试中使用 with-redefs ,并作为最后的手段,动态地改变未被声明为^:dynamic
的控制之外的vars行为(然后谨慎使用)。