gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:49:03 24 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 crateusemodstructenumuniontypetraitimplfnstaticconstextern和宏之一。

您可以将项目放置在功能之外或功能中。但是,它们之间是有区别的:
  • 如果它出现在函数之外,则必须在不需要时省略;
  • 如果它出现在函数中,则也可以在其中放置;。这基本上是因为;本身是一个空语句

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

    最后的表达

    如果您必须省略 ;
  • 这是该块中的最后一条语句
  • 它是一个表达式(items和let不是表达式),而
  • 您要从表达式返回值。

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

    块表达式
    ifif letmatchloopwhilewhile letforunsafe和裸 {}}结尾,因此您可以在它们之后省略 ;。但是,如果将 ;放在此处,则会产生轻微的影响。

    例子:
    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![]:这实际上不是语句宏;相反,这只是一个表达式宏。它不能扩展为items或let
  • some_macro!{}:这扩展为零个或多个语句。
  • some_macro!();/some_macro![];/some_macro!{};:这也扩展为零个或多个语句;但是,有一个很小的区别:;被添加到最后一个扩展语句中。
  • 关于rust - 为什么可以在不使用分号的情况下定义Rust结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61310141/

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