当前 clojure.core/*assert*
的默认值是 true
。
这给库的创建者和使用者带来一些影响。
作为一个库的创建者,你不能在各个地方添加断言来帮助你在开发/测试中,因为它会让大多数用户在生产中支付性能代价,因为他们将以启用 *asserts*
的形式运行。
作为一个库的使用者,因为你不知道哪些库在使用断言,你必须始终记得禁用它们以防止意外。
由于在 Clojure 中很难全球性地禁用它们,因为 assert
是一个检查 *assert*
的宏,变量的值需要在加载任何命名空间之前设置,这使得这种情况更加复杂。
相比之下,Java 默认禁用所有断言,因此库的创建者不必考虑这个问题,而消费者可以在开发时间通过提供 java -ea
(启用断言) 明确启用它们。
由于我猜测更改 *assert*
的默认值可能因向下兼容性问题而变得复杂,所以或许可以添加一个像 Rust 中的 debug-assert
,这默认不会启用。
在我看来,关键部分是拥有一个简单的检查指令,我们知道默认情况下不会影响性能,这样我们的代码库在测试和开发时的强化就不会与默认情况下的生产性能耦合。
其他两种选择是更好的默认值,一个是 false
,另一个是 java.lang.Class#desiredAssertionStatus()
返回的值,这个值似乎根据是否提供 -ea
标志返回 true/false,默认也是 false
。但是,由于大多数 Clojure 用户已经依赖于默认开启 assert,这可能不是一种选择。