目前 `clojure.core/*assert*` 的默认值是 true
。
这对库的创建者和使用者都有一些意义。
作为库的创建者,您不能随意在各个地方添加断言来帮助您进行开发/测试,因为这会导致大多数用户在生产环境中付出性能代价,因为他们将与 *asserts*
启用运行。
作为库的使用者,由于您不知道哪些库正在使用断言,您必须始终记住在必要时禁用它们。
实际上,在 Clojure 中全局禁用这些断言并不容易,因为 `assert` 是一个宏,它会检查 `*assert*
`,变量的值需要在加载任何命名空间之前设置。
相反,Java 默认禁用所有断言,因此库的创建者不必为此担忧,而消费者可以在开发时间通过提供 `java -ea`(启用断言)来显式启用它们。
鉴于我猜想更改 `*assert*
` 的默认值可能因向后兼容性问题而变得复杂,也许可以添加一个像 Rust 中的 `debug-assert
` 一样,默认不启用的断言。
在我看来,重要的是要有一个简单的不变量检查指令,我们知道默认情况下它不会影响性能,这样我们就可以在不影响生产性能的情况下默认情况下使代码库更安全地进行测试和开发。
其他两个选项是更好默认值的 assert,一个是 `false
`,另一个是 `java.lang.Class desiredAssertionStatus()
` 的值,该值似乎根据是否提供了 `-ea
` 标志返回真/假,默认情况下也将是 `false
`。但是,由于大多数 Clojure 用户已经依赖默认情况下 assert 为 true,这可能不是一个好选择。