gpt4 book ai didi

rust - 为什么可以在没有分号的情况下定义 Rust 结构?

转载 作者:行者123 更新时间:2023-11-29 08:25:16 31 4
gpt4 key购买 nike

我正在学习 Rust,关于结构的章节给出了一个没有 ; 结尾的结构示例。它可以编译,但我不知道为什么允许这样做。

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

...实际上,函数也有同样的问题。

最佳答案

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

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

但是,也有一些异常(exception)情况:

{} 间接出现时

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

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

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

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

项目

项是您也可以放置在函数之外的东西。即,extern crateusemodstructenum 之一, union, type, trait, impl, fn, static constextern 和宏。

您可以将项放置在函数外部或函数中。但是,它们之间是有区别的:

  • 如果它出现在函数之外,您必须在不需要时省略;
  • 如果它出现在函数中,您也可以将 ; 放在那里。这基本上是因为 ; 本身是一个空语句

例子:

struct A {} // You can't place ; here
fn main() {
struct B {} // You can omit ; here
struct C {}; // You can also place ; here
}

最后一个表达式

你必须省略 ; 如果

  • 这是 block 中的最后一条语句,
  • 它是一个表达式(items 和 let 不是表达式),并且
  • 您想从表达式中返回值。

例子:

fn f() -> i32 {
let x = 1;
x + x // You want to return x + x, so you can't place `;` here
}

block 表达式

if, if let, match, loop, while, while letforunsafe 和 bare {}} 结尾,所以您可以在它们之后省略 ;。但是,如果将 ; 放在这里,会有轻微的影响。

例子:

fn f(x: i32) -> i32 {
if x < 10 {
10
} else {
20
}; // If you remove ; here, then you will see a compile error.
42
}

在大多数情况下,您不必在此处放置;;相反,您可能必须将 ; 放在 block 中。

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!{};:这也扩展为零个或多个语句;但是,有一个非常小的区别:; 被添加到最后一个展开的语句中。

关于rust - 为什么可以在没有分号的情况下定义 Rust 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44990058/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com