<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 枚舉 > [enums.md](https://github.com/rust-lang/rust/blob/master/src/doc/book/enums.md) commit 31e39cd05c9b28c78b087aa9314f246b0b0b5cfa Rust 中的一個`enum`是一個代表數個可能變量的數據的類型。每個變量都可選是否關聯數據: ~~~ enum Message { Quit, ChangeColor(i32, i32, i32), Move { x: i32, y: i32 }, Write(String), } ~~~ 定義變量的語法與用來定義結構體的語法類似:你可以有不帶數據的變量(像類單元結構體),帶有命名數據的變量,和帶有未命名數據的變量(像元組結構體)。然而,不像單獨的結構體定義,一個`enum`是一個單獨的類型。一個枚舉的值可以匹配任何一個變量。因為這個原因,枚舉有時被叫做“集合類型”:枚舉可能值的集合是每一個變量可能值的集合的總和。 我們使用`::`語法來使用每個變量的名字:它們包含在`enum`名字自身中。這樣的話,以下的情況都是可行的: ~~~ # enum Message { # Move { x: i32, y: i32 }, # } let x: Message = Message::Move { x: 3, y: 4 }; enum BoardGameTurn { Move { squares: i32 }, Pass, } let y: BoardGameTurn = BoardGameTurn::Move { squares: 1 }; ~~~ 這兩個變量都叫做`Move`,不過他們包含在枚舉名字中,他們可以無沖突的使用。 枚舉類型的一個值包含它是哪個變量的信息,以及任何與變量相關的數據。這有時被作為一個“標記的聯合”被提及。因為數據包括一個“標簽”表明它的類型是什么。編譯器使用這個信息來確保安全的訪問枚舉中的數據。例如,我們不能簡單的嘗試解構一個枚舉值,就像它是其中一個可能的變體那樣: ~~~ fn process_color_change(msg: Message) { let Message::ChangeColor(r, g, b) = msg; // compile-time error } ~~~ 不支持這些操作(比較操作)可能看起來更像限制。不過這是一個我們可以克服的限制。有兩種方法:我們自己實現相等(比較),或通過[`match`](#)表達式模式匹配變量,你會在下一部分學到它。我們還不夠了解Rust如何實現相等,不過我們會在[特性](#)找到它們。 ### 構造器作為函數(Constructors as functions) 一個枚舉的構造器總是可以像函數一樣使用。例如: ~~~ # enum Message { # Write(String), # } let m = Message::Write("Hello, world".to_string()); ~~~ 與下面是一樣的: ~~~ # enum Message { # Write(String), # } fn foo(x: String) -> Message { Message::Write(x) } let x = foo("Hello, world".to_string()); ~~~ 這對我們沒有什么直接的幫助,直到我們要用到[閉包](#)時,這時我們要考慮將函數作為參數傳遞給其他函數。例如,使用[迭代器](#),我們可以這樣把一個`String`的vector轉換為一個`Message::Write`的vector: ~~~ # enum Message { # Write(String), # } let v = vec!["Hello".to_string(), "World".to_string()]; let v1: Vec<Message> = v.into_iter().map(Message::Write).collect(); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看