为什么没有分号就可以定义Rust结构?

时间:2017-07-08 19:32:41

标签: rust

我正在学习Rust,结构的章节给出了最后没有;的结构的例子。它编译但我不知道为什么允许这样做。

fn main() {
    struct User {
        username: String,
        email: String,
        sign_in_count: u64,
        active: bool,
    }
}

......实际上,同样的问题也适用于函数。

1 个答案:

答案 0 :(得分:3)

正如Shepmaster在评论中所说,"原因"是Rust定义的。在这里,我将解释它背后的规则。

基本上,当; 结束时,您可以省略}。这将回答你的问题。

但是,该规则有许多例外情况:

{}间接出现

{}间接出现时,上述规则不适用,例如

use std::io::{self, Read, Write}; // Here }; appears

let x = if cond {
    1
} else {
    2
}; // Here }; appears

在这种情况下,{}不是use / let的直接部分。因此,在这种情况下,您需要;

产品

项目也是您可以放置​​在函数之外的东西。也就是extern crateusemodstructenumuniontype,{{1}之一}},traitimplfnstaticconst和宏。

您可以将项目放在函数外部或函数中。但是,它们之间存在差异:

  • 如果它出现在功能之外,则必须在不必要时省略extern
  • 如果它出现在函数中,您也可以在其中放置;。这基本上是因为;本身是空语句

示例:

;

最后一个表达式

如果

,则必须省略struct A {} // You can't place ; here fn main() { struct B {} // You can omit ; here struct C {}; // You can also place ; here }
  • 这是该块中的最后一个声明,
  • 这是一个表达式(项目和;不是表达式),
  • 您想要从表达式中返回值。

示例:

let

块表达式

fn f() -> i32 { let x = 1; x + x // You want to return x + x, so you can't place `;` here } ifif letmatchloopwhilewhile letforunsafe以[{1}}结尾,因此您可以在{}之后省略}。但是,如果您在此处放置;,则会产生轻微影响。

示例:

;

在大多数情况下,您不必在此处fn f(x: i32) -> i32 { if x < 10 { 10 } else { 20 }; // If you remove ; here, then you will see a compile error. 42 } ;相反,您可能必须在块中放置;

;

语句宏

在陈述位置,您可以编写三种不同的宏:

  • fn f(x: i32) -> i32 { if x < 10 { 10; } else { 20; } 42 } / some_macro!():这实际上并不是一个声明宏;相反,这只是一个表达式宏。它无法扩展为项目或some_macro![]
  • let:这会扩展为零或更多语句。
  • some_macro!{} / some_macro!(); / some_macro![];:这也扩展为零或更多的陈述;但是,存在非常小的差异:some_macro!{};被添加到最后一个扩展语句中。