18

在我看来,它with-redefs可以做binding动态符号可以做的所有事情,只是它没有需要^:dynamic元数据的限制。那么我什么时候应该使用其中一个呢?

4

1 回答 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 回答