2015-04-04 45 views
2

如果我们在全局范围的枚举声明的末尾添加;,编译器会报错。为什么在全局范围中声明的枚举不需要终止分号?

#[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); 
} 

我浪费了很多时间(刚才)确定编译器在抱怨什么。我没有想到枚举声明(在全局范围内)不能以;终止。为什么存在这种不一致(或者我误解了什么)?

回答

5

没有不一致。你在函数中写的是enum项,空声明,以及包含表达式宏调用的语句。

+1

确实'fn main(){;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ''实际上编译! – Levans 2015-04-04 08:11:55

+0

我的实际问题不是第二个例子,而是第一个例子。为什么用';'终止全局范围中的枚举声明会产生编译器错误? – 2015-04-04 13:47:04

+0

@basic_bgnr:你*不是*用*结束enum声明---你正在写一个空的语句,并且你不能在模块级别有语句。请注意,有一些声明表单需要*分号(例如,写入没有成员的'struct'或'enum'),但这不是其中之一。 – 2015-04-06 02:32:16