什么是对具有副作用的函数的返回值断言的Rust方式?

use*_*039 1 debugging assert rust

在C中,断言可以通过定义消失NDEBUG,因此我们倾向于编写如下内容:

const bool ok = my_function();
assert(ok);
Run Code Online (Sandbox Code Playgroud)

但是,看起来Rust中的断言始终存在于每种类型的构建中,无论配置如何,因此更好的方法是:

let ok = my_function();
assert!(ok);
Run Code Online (Sandbox Code Playgroud)

要么:

assert!(my_function());
Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

看起来Rust中的断言始终存在于每种类型的构建中

是的,assert!始终存在,但debug_assert!仅在调试版本中启用.


什么被认为更好

这是基于意见的.做任何让你开心的事.我个人因为条件编译因代码编译而消失的代码中的副作用代码被咬了多次,所以我赞成将断言作为一个单独的行.但是,当断言编译时,这将导致未使用的变量警告.

更好的是,重新评估为什么你在断言中有副作用; 我打赌,这几乎总是一个坏主意.

  • 可能失败的函数的Rust习语是返回`Result <(),SomeError>`,而不是`bool`.因此,如果你想在函数失败时发生恐慌,你就不会"断言!",你会``unwrap()`结果. (3认同)
  • @ user1000039在副作用函数上断言都不是**常见的**因为在副作用函数上断言*只是一个坏主意*.对于我们不应该首先编写的代码,没有理由使用成语.当谈到在非副作用函数上断言时,我希望`assert!(some_boolean())`会更常见,因为它更短. (2认同)