gpt4 book ai didi

clojure - 当您不需要将某些内容定义为动态来 with-redefs 时,将某些内容定义为动态的意义何在?

转载 作者:行者123 更新时间:2023-12-03 00:56:27 25 4
gpt4 key购买 nike

在我看来,with-redefs可以做绑定(bind)到动态符号可以做的所有事情,只是它没有需要的限制>^:动态元数据。那么我什么时候应该使用其中一种而不是另一种呢?

最佳答案

除了需要 ^:dynamic 元数据之外,binding 还会创建仅在当前线程中可见的绑定(bind),而由 with-redefs 生成的绑定(bind) 在所有线程中都可见。因此,with-redefs 是一个非常生硬的工具,有可能影响同一虚拟机中运行的其他代码。我从未见过在测试代码之外使用 with-redefs ,也不应该这样(至少在我看来)。

我将两者之间的区别总结如下:

  • 绑定(bind)^:dynamic允许您以受控的方式引入一点动态行为。这是在 API 中定义扩展点的好方法,让调用链上游的调用者可以更改代码的行为,而无需在调用堆栈中一路显式传递参数(其中一些甚至可能不是他们的代码)。
  • with-redefs 是一场混战。它在测试中很有用,例如当被测函数有很多依赖项时,用于模拟整个子系统。

将变量声明为 ^:dynamic 以及使用耳罩命名动态变量的约定(例如 *my-dynamic-var*),添加了额外的好处是,它是一种 self 记录的方式,向调用者宣传您的那部分代码可以动态修改。

总之:在编写 API 和生产代码时更喜欢 ^:dynamic绑定(bind)。在测试中使用 with-redefs ,并作为最后的手段来动态改变超出您控制范围且未声明 ^:dynamic 的变量的行为(然后,使用 with小心)。

关于clojure - 当您不需要将某些内容定义为动态来 with-redefs 时,将某些内容定义为动态的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15747774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com