如果不使用返回值,`unwrap()`的目的是什么?

Nae*_*mul 5 error-handling stdin rust

我找到了这个Rust代码来获取一行stdin:

use std::io;

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

io::stdin().read_line(&mut line)line变量设置为从中读取的行stdin.根据我的理解,read_line()返回一个Result值,它可以是模式匹配的,或者.unwrap()可以用来获取内部值,如果它不是Err.

但是,read_line()从不使用返回值.仅使用line字符串变量,但.unwrap()即使未使用,人们也会使用大部分时间.

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

Mat*_* M. 10

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

是的,但并非全部.

忽视潜在的错误是不好的; 空的lineline由于错误而未被读取的空间之间存在很大差异; 例如在一个外壳典型的"管道"命令,该程序需要停止时它将停止接收输入,否则用户必须杀死它.

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

为了避免困扰C程序的问题,它太容易忘记检查返回代码,通常Rust函数会捆绑预期的返回值和错误Result,因此你必须检查它以获得返回值.

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

这里调用了一些编译器魔法:Result结构用#[must_use]属性标记.此属性使得必须在Result返回时执行某些操作.

因此,在您的情况下,不仅是打包好,它也是"做某事"并避免编译警告的最简单方法.

  • @Shepmaster:当然,属性本身不过*是*魔法(黑魔法,我认为)。我的意思是,如果 Rust 支持线性类型(而不仅仅是仿射类型),它可以在类型系统中“正确地”建模,但是它没有,而是我们有这个小属性,它使类型“接近线性-但不完全”。 (2认同)