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报告)
...