目前 clojure.core/*assert*
的默认值是 true
。
这对库的创建者和消费者有一些影响。
作为一个库的创建者,你不能只是随意添加断言来帮助开发/测试,因为这会让大部分用户在生产环境付出性能代价,因为他们的 *asserts*
将被启用。
作为一个库的消费者,因为你不知道哪些库使用了断言,你必须始终记得在必要时禁用它们。
由于 Clojure 中的断言是一个检查 *assert*
的宏,因此需要设置变量的值,这需要在加载任何命名空间之前完成,这使得在 Clojure 中全局地禁用断言变得困难。
相反,Java 默认禁用所有断言,因此库的创建者不必为此担心,而消费者可以在开发时通过提供 java -ea
(启用断言)来显式启用它们。
由于我猜更改 *assert*
的默认值可能会因为向后兼容性问题而变得棘手,所以也许可以添加一个类似于 Rust 的 debug-assert
,默认不启用。
在我看来,重要的是拥有一个简单的不可变检查指令,我们知道默认情况下它不会影响性能,这样我们的代码库在测试和开发时就可以不与生产性能耦合。
另外两种选择是更好的 assert 默认值,一个是为 false
,另一个是 java.lang.Class
的 desiredAssertionStatus()
方法的返回值,这似乎会根据是否提供了 -ea
标志返回真/假,这也将默认为 false
。但由于大多数 Clojure 用户已经依赖于默认启用 assert,这可能不是一种选项。