Rust 为什么在全局范围中声明的枚举不需要终止分号?

Rust 为什么在全局范围中声明的枚举不需要终止分号?,rust,Rust,如果我们明确添加在全局范围中枚举声明的末尾,编译器将发出抱怨 #[derive(Debug)] enum Organs{ Head, Tail, }; fn main(){ println!("{:?}", Organs::Head); } 生成的错误消息是 enums.rs:5:2: 5:3 error: expected item, found `;` enums.rs:5 }; 但是,当在函数中声明时,语句终止符不是必需的,程序将编译时使用或不使用 fn ma

如果我们明确添加
在全局范围中枚举声明的末尾,编译器将发出抱怨

#[derive(Debug)]
enum Organs{
    Head,
    Tail,
};

fn main(){
    println!("{:?}", Organs::Head);
}
生成的错误消息是

enums.rs:5:2: 5:3 error: expected item, found `;`
enums.rs:5 };
但是,当在函数中声明时,语句终止符不是必需的,程序将编译时使用或不使用

fn main(){
    #[derive(Debug)]
    enum Organs{
        Head,
        Tail,
    };
    println!("{:?}", Organs::Head);
}

我(刚才)浪费了大量时间来确定编译器在抱怨什么。我没有想到枚举声明(在全局范围内)不能用
终止。为什么会出现这种不一致(或者我误解了什么)

没有不一致之处。您在函数中编写的是一个
enum
项、一个空语句和一个包含表达式宏调用的语句。

实际上
fn main(){;;}
确实可以编译!我的实际问题不是第二个例子,而是第一个例子。为什么会这样,用
终止全局范围内的enum声明生成编译器错误?@basic_bgnr:您没有使用
终止枚举声明---您正在编写一条空语句,并且不能在模块级使用语句。请注意,有些声明表单需要分号(例如编写没有成员的
struct
enum
),但这不是其中之一。@DK。但是我们不能在模块级使用
use、static
等语句。为什么在顶层不能有空语句?防止使用空
的逻辑是什么在模块级?因为这些不是语句。它们是物品,没有“空物品”物品。逻辑很简单,语法的构造使得你不能有一个单独的
在模块级别。