枚舉

2018-08-12 22:03 更新

枚舉

在 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ù)的安全性。例如,你不能簡單的就好像它是可能變量之一一樣來嘗試解構(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í)到。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)