宏调用后为什么没有分号?

时间:2017-10-27 07:31:24

标签: syntax rust

我正在关注我在Rust上发现的一些教程,并且遇到了我的Java / C / C ++头脑无法理解的东西:

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

我不明白write!宏调用结束时缺少分号。如果我添加它,我会从编译器中收到错误。 我猜测如果分号不在那里,那么来自Result的{​​{1}}被用作write!的返回值,但任何人都可以提供更具体的解释,为什么会这样,如果是总是适用?

1 个答案:

答案 0 :(得分:5)

write宏使用来自std::fmt::Write或来自std::io::Writewrite_fmt()方法;两者都返回Result<(), Error>,你需要省略分号才能将它作为fmt()的输出。

来自The Rust Book,第1版:

  

Rust函数只返回一个值,并声明类型   在'箭头'之后,这是一个破折号( - )后跟一个大于号的符号   (大于)。函数的最后一行确定它返回的内容。你会   注意这里没有分号。如果我们添加它,我们会   得到一个错误。

     

这揭示了关于Rust的两个有趣的事情:它是一个   基于表达式的语言和分号不同   其他“基于大括号和分号”的语言中的分号。