scala - scala中的require和assert之间如何选择

标签 scala

requireassert 都用于在运行时执行某些检查以验证某些条件。

那么它们之间的基本区别是什么?

我看到的唯一一个是 require 抛出 IllegalArgumentExceptionassert 抛出 AssertionError

如何选择使用哪一个?

最佳答案

Kigyo提到存在语义差异

  • 断言意味着您的程序已达到不一致的状态,这可能是当前方法/函数的问题(我喜欢将其视为 HTTP 500 InternalServerError)
  • require 意味着该方法的调用者有错误,应该修复其调用(我喜欢将其视为 HTTP 400 BadRequest)

还有一个主要的技术差异:

assert 使用 @elidable(ASSERTION) 进行注释 这意味着您可以使用 -Xelide-below ASSERTION 或使用 -Xdisable-assertions 编译程序,编译器不会生成断言的字节码。如果您有大量断言,这可以显着减少字节码大小并提高性能。

了解了这一点,您就可以使用断言来验证程序中所有不变量各处(每个单独的前提条件/后置条件)方法/函数调用)而不是在生产中付出代价。

您通常会在启用所有断言的情况下进行“测试”构建,它会比较慢,因为它会始终验证所有断言,然后您可以进行“生产” “在没有断言的情况下构建您的产品,您将消除通过断言完成的所有内部状态检查

require 是不可省略的,在库(包括内部库)中使用它更有意义,以通知调用者调用给定方法/函数的前提条件。

关于scala - scala中的require和assert之间如何选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140757/

相关文章:

scala - 定义一个 Scala 变量范围

scala - bigquery 在数组外添加重复记录

scala - 为什么 Play 的 PushEnumerator 需要在迭代器完成之前关闭()?

scala - Scala 中 NonFatal 和 Exception 的区别

scala - 如何在scala中获得元组数组的总和

scala - Spark:如何告诉Spark使用本地hadoop而不是其嵌入式hadoop?

java - 在 AWS 上部署 Kafka

scala - 以 scalaz.NonEmptyList[A] 作为成员且 ===、equals、== 的案例类

scala - 将对象 append 到 Scala 中的 ListBuffer 的问题

scala - `this` 输入 Scala