2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面,了解更多关于本网站的工作方式。

+3
文档

目前,《with-redefs》的文档字符串建议在测试中使用。然而,有多个原因说明使用此宏进行测试不是最佳选择。

  • `with-redefs`的"绑定"不会转移到新线程,因为这是一个全局变更。
  • 如果用户将原始类型提示函数重新定义为仅接受对象的函数,则可能会在运行时遇到错误。
  • 如果`with-redefs`的主体部分被延迟(使用延迟、go 块等),则该代码可能看不到新的根。
  • 由于这是一个全局变更,所以它会"泄漏"到当前作用域之外,进入可能正在另一个线程中运行的代码中。
  • Clojure倾向于避免全局变更,但此宏既没有标记为`!`,也没有正确警告用户这里提到的危险。

由于这些原因,我经常遇到新用户在不理解这样做的影响的情况下使用`with-redefs`。如果用户了解Vars的工作原理,这些行为都有意义,但对于新用户来说,这需要掌握大量的知识。

建议
删除关于在测试中使用`with-redefs`的建议
添加一些关于全局变更和宏的并发问题的警告。

1 个答案

0
参考:https://clojure.atlassian.net/browse/CLJ-2134(由halgari报告)
...