如果不使用 return 值,`unwrap()` 的用途是什么?

What is purpose of `unwrap()` if the return value is not used?

我发现这个 Rust 代码用于从 stdin:

获取一行
use std::io;

fn main() {
    let mut line = String::new();
    io::stdin().read_line(&mut line).unwrap();
    println!("Input: {}", line);
}

io::stdin().read_line(&mut line)line 变量设置为从 stdin 读取的行。根据我的理解,read_line() returns 一个 Result 值,可以进行模式匹配,或者 .unwrap() 如果不是 [= 则可以用来获取内部值19=].

然而,read_line()的返回值从未被使用过。只使用了line字符串变量,但人们大多数时候使用.unwrap()即使不使用

如果不使用返回值,unwrap()的目的是什么?只是为了抛出一个错误?

如果您不想"elegantly"处理无法从标准输入读取一行的情况(例如再次尝试或选择默认值),您可以使用unwrap() 触发恐慌;它会消除由未使用的 Result 引起的警告:

warning: unused result which must be used
 --> src/main.rs:5:5
  |
5 |     io::stdin().read_line(&mut line);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(unused_must_use)] on by default

What is the purpose of unwrap() if the returned value is not used? Just to throw an error?

是的,但这还不是全部

忽略潜在的错误是不好的;空 line 和因错误而未被读取的 line 之间存在很大差异;例如,在 shell 中的典型 "pipeline" 命令中,程序 需要 在停止接收输入时停止,否则用户必须终止它。

在C语言中,忽略错误太容易了。许多语言通过异常来解决这个问题,但 Rust 没有。

为了避免 C 程序很容易忘记检查 return 代码的问题,通常 Rust 函数会将预期的 return 值和 [=13= 中的错误捆绑在一起],以便您检查它以获得return值。

然而,还有一个潜在的问题:如果调用者不关心 return 值怎么办?最值得注意的是,当值为 () 时,没有人真正关心它。

这里调用了一些编译器魔法:Result 结构用 #[must_use] 属性标记。此属性使得在 returned.

必须对 Result 执行某些操作

因此,在您的情况下,展开不仅好,而且是 "do something" 和避免编译警告的最简单方法。