在 Rust 中建立字串列舉

Nilesh Katuwal 2023年1月30日 2022年7月18日
  1. 在 Rust 中建立 enum
  2. Rust 中的彈奏
在 Rust 中建立字串列舉

在本文中,我們將學習如何在 Rust 中建立字串列舉。

在 Rust 中建立 enum

在 Rust 中,一個 enum 表示作為多個可能版本之一的資料。enum 關鍵字允許開發可能是幾個可能版本之一的型別。

任何作為 struct 有效的版本也作為 enum 有效。此外,enum 中的每個版本都可以有可選的相關資料:

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

存在沒有資料的變體、具有命名資料的變體和具有匿名資料的變體。定義變體的語法模仿了定義諸如 tuple structs 之類的結構的語法。

與單個結構定義相比,enum 是單一型別。enum 值可以匹配任何變體。

這就是為什麼列舉經常被稱為求和型別:潛在的列舉值的集合是可能的變數值集合的總和。

我們使用 :: 語法來引用每個變體的名稱,該名稱由 enum 本身的名稱限定。

Rust 中的彈奏

Strummacros 和特性的集合,這些特性使得在 Rust 中使用 enums 和字串更容易。

EnumString:自動派生 std::str::FromStr 應用於 enum。每個 enum 版本都將匹配其名稱。

這可以通過在屬性上使用 serialize="DifferentName"string="DifferentName"來覆蓋,如下所示。可以將許多反序列化新增到相同的變體中。

如果變體包含其他資料,反序列化會將它們設定為預設值。default 屬性可以應用於具有單個資料引數的元組變體。

如果未找到匹配項,則返回指定的變體,並將輸入字串作為引數捕獲。這是由 EnumString 繼承建立的程式碼示例。

#[derive(EnumString)]
enum Cars {
    BMW,
    Volvo { range:usize },

    #[strum(serialize="Toyota",serialize="b")]
    Toyota(usize),

    #[strum(disabled="true")]
    Fiat,
}

請注意,FromStr 的預設實現僅匹配變體的名稱。DisplayToString 都返回指定的 enum 變體。這使你能夠將單元樣式變體從 enum 轉換為字串並再次轉換回來。

此外,ToStringDisplay 根據以下標準選擇適當的序列化。

  1. 如果存在字串屬性,將使用此值。每個版本只允許一個。
  2. 選擇值最長的序列化屬性。如果不需要此行為,請改用 to 字串。
  3. 最後,如果 serializeto string 屬性都不存在,將使用變體的名稱。

Display 優於 ToString 所有實現 ::std::fmt::Display 的型別都有 ToString 的預設實現。

use std::string::ToString;

#[derive(Display, Debug)]
enum Cars {
    #[strum(serialize="redred")]
    BMW,
    Volvo { range:usize },
    Toyota(usize),
    Ferrari,
}

fn debug_cars() {
    let BMW = Cars::BMW;
    assert_eq!(String::from("BMWBMW"), BMW.to_string());
}

fn main () { debug_cars(); }

相關文章 - Rust String