关于rust:为什么要添加尝试! 写! 停止未使用的代码编译器警告?

Why does adding try! to writeln! stop an unused-code compiler warning?

我遵循的是Rust by Example Docs,
并且收到了我不理解的编译器警告。

考虑以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use std::fmt::{self, Display};

struct Matrix(f32, f32, f32, f32);

impl Display for Matrix  {
    fn fmt(&self, f : &mut fmt::Formatter) -> fmt::Result {
        try!(writeln!(f," ( {:.2}, {:.2} )", self.0, self.1));
        write!(f," ( {:.2}, {:.2} )", self.2, self.3)
    }
}

fn main() {
    let m = Matrix(1f32,2f32,3f32,4f32);
    print!("{}", m);
}

这可以正确编译,并且可以正常工作,但是如果我们从第一个writeln!中删除try!,则该行将变为

1
writeln!(f," ( {:.2}, {:.2} )", self.0, self.1);

我收到此编译器警告:

1
2
<std macros>:2:1: 2:54 warning: unused result which must be used, #[warn(unused_must_use)] on by default
<std macros>:2 $ dst . write_fmt ( format_args ! ( $ ( $ arg ) * ) ) )

这是为什么? 编译器试图告诉我什么? writeln!是否返回try!正在检查的某种错误对象?

我在这里找到了writeln!宏的源代码:https://github.com/rust-lang/rust/blob/36d746718086dfcc12f73562b1996daf2f8ba643/src/libcore/macros.rs#L396
但我对它的理解还不够好,无法回答自己的问题。

rustc --version给我rustc 1.10.0 (cfcb716cf 2016-07-03),如果相关的话。


write!writeln!在传递给宏的第一个参数上调用名为write_fmt的方法。 这通常对应于std::io::Writestd::fmt::Write特征(要求您首先use特征)的方法,或与std::fmt::Formatter结构的方法相对应的方法。

您会注意到它们都返回ResultResult具有#[must_use]属性,该属性将触发"必须使用的未使用结果"警告。

另一方面,print!println!仅返回()