鍍金池/ 教程/ Java/ 枚舉
While 循環(huán)
宏命令
模式
Rust 嵌入到其他語言
變量綁定
if
發(fā)布通道
Lang 項(xiàng)目
匹配
文檔
棧和堆
不依賴 stdlib
原始指針
條件編譯
type 別名
關(guān)聯(lián)類型
全類型
詞匯表
基本類型
Hello, world!
測(cè)試
箱和模塊
字符串
向量
引用與借用
所有權(quán)
內(nèi)斂函數(shù)
基準(zhǔn)測(cè)試
Nightly Rust
for 循環(huán)
特征
特征的對(duì)象
鏈接參數(shù)
介紹
'Deref'強(qiáng)制轉(zhuǎn)換
枚舉
內(nèi)聯(lián)匯編
泛型
方法語法
函數(shù)
外部函數(shù)接口
盒語法和模式
安裝 Rust
unsafe    
生存期
切片模式
Borrow 和 AsRef
If let
學(xué)習(xí) Rust
“常量”和“靜態(tài)”
語法和語義
迭代器
相關(guān)學(xué)術(shù)研究
通用函數(shù)調(diào)用語法
哲學(xué)家就餐問題
類型轉(zhuǎn)換
閉包
并發(fā)性
Hello, Cargo!
屬性
注釋
結(jié)構(gòu)體
編譯器插件
高效 Rust
相關(guān)常量
猜謎游戲
可變性
錯(cuò)誤處理
新手入門
操作符和重載

枚舉

在 Rust 中枚舉是一個(gè)類型,它表示幾個(gè)可能變量中的一個(gè)數(shù)據(jù):

enum Message {
Quit,
ChangeColor(i32, i32, i32),
Move { x: i32, y: i32 },
Write(String),
}

每個(gè)變量可以選擇性的有與之關(guān)聯(lián)的數(shù)據(jù)。定義變量的語法與之前定義結(jié)構(gòu)體的語法類似:你可以有不包含數(shù)據(jù)的變量(如 unit-like 結(jié)構(gòu)體),已經(jīng)命名數(shù)據(jù)的變量,和未命名數(shù)據(jù)的變量(如數(shù)據(jù)結(jié)構(gòu)體)。然而,不同于單獨(dú)的結(jié)構(gòu)體定義,枚舉是一種類型。枚舉的值可以與任何變量匹配。為此,一個(gè)枚舉有時(shí)被稱為‘總和類型’:這個(gè)枚舉的可能值的集合是每個(gè)變量的可能值的集合的總和。

我們使用 :: 語法來使用每個(gè)變量的名稱:它們由枚舉本身的名字來劃分作用域。這允許以下的代碼實(shí)現(xiàn):

let x: Message = Message::Move { x: 3, y: 4 };

enum BoardGameTurn {
Move { squares: i32 },
Pass,
}

let y: BoardGameTurn = BoardGameTurn::Move { squares: 1 }; 

這兩個(gè)變量都被命名為 Move,但是由于它們局限于枚舉的名稱,它們可以無沖突使用。

一個(gè)枚舉類型的值包含它是哪個(gè)變量的信息,不包括與該變量相關(guān)聯(lián)的任何數(shù)據(jù)。它有時(shí)被稱為‘標(biāo)簽結(jié)合’,因?yàn)閿?shù)據(jù)中包括一個(gè)‘標(biāo)簽’用來指示數(shù)據(jù)的類型。編譯器使用這些信息來保證你訪問枚舉中的數(shù)據(jù)的安全性。例如,你不能簡(jiǎn)單的就好像它是可能變量之一一樣來嘗試解構(gòu)一個(gè)值:

fn process_color_change(msg: Message) {
let Message::ChangeColor(r, g, b) = msg; // compile-time error
}

不支持這些操作可能會(huì)看起來相當(dāng)受限制,但是這是一個(gè)我們可以克服的限制。這里有兩種方式:通過我們自己實(shí)現(xiàn)相等,或者通過模式匹配帶有模式表達(dá)式的變量,你將在下一節(jié)中學(xué)習(xí)這些內(nèi)容。我們對(duì)于 Rust 怎樣實(shí)現(xiàn)平等了解還不夠,但是我們會(huì)在特性章節(jié)學(xué)習(xí)到。