我正在学习Rust,结构的章节给出了最后没有;
的结构的例子。它编译但我不知道为什么允许这样做。
fn main() {
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
}
......实际上,同样的问题也适用于函数。
答案 0 :(得分:3)
正如Shepmaster在评论中所说,"原因"是Rust定义的。在这里,我将解释它背后的规则。
基本上,当;
结束时,您可以省略}
。这将回答你的问题。
但是,该规则有许多例外情况:
{}
间接出现当{}
间接出现时,上述规则不适用,例如
use std::io::{self, Read, Write}; // Here }; appears
或
let x = if cond {
1
} else {
2
}; // Here }; appears
在这种情况下,{}
不是use
/ let
的直接部分。因此,在这种情况下,您需要;
。
项目也是您可以放置在函数之外的东西。也就是extern crate
,use
,mod
,struct
,enum
,union
,type
,{{1}之一}},trait
,impl
,fn
,static
,const
和宏。
您可以将项目放在函数外部或函数中。但是,它们之间存在差异:
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
}
,if
,if let
,match
,loop
,while
,while let
,for
,unsafe
以[{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!{};
被添加到最后一个扩展语句中。