在我看来,它with-redefs
可以做binding
动态符号可以做的所有事情,只是它没有需要^:dynamic
元数据的限制。那么我什么时候应该使用其中一个呢?
问问题
384 次
1 回答
17
除了需要^:dynamic
元数据之外,binding
还会创建仅在当前线程中可见的绑定,而由 by进行的绑定with-redefs
在所有线程中都可见。因此,with-redefs
这是一个非常生硬的工具,并且有可能影响在同一 VM 中运行的其他代码。我从未见过with-redefs
在测试代码之外使用过,也不应该(至少在我看来)。
我将两者之间的区别总结如下:
- 与^:dynamic绑定允许您以受控方式引入一些动态行为。这是在 API 中定义扩展点的好方法,它可以让调用链上的调用者更改代码的行为,而无需在调用堆栈中一直显式传递参数(其中一些甚至可能不是他们的代码)。
- with-redefs是免费的。它在测试中很有用,例如,当被测函数有很多依赖关系时,它可以模拟整个子系统。
将 var 声明为^:dynamic
,以及使用耳罩命名动态 var 的约定(例如*my-dynamic-var*
),还有一个额外的好处,那就是它是一种自我记录的方式,向调用者宣传你的代码的那部分可以动态修改。
总结:在编写 API 和生产代码时更喜欢^:dynamic和绑定。在测试中使用with-redefs,并作为最后的手段来动态改变未声明的变量的行为超出您的控制^:dynamic
(然后谨慎使用)。
于 2013-04-01T17:33:52.540 回答