在 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 中的彈奏
Strum
是 macros
和特性的集合,這些特性使得在 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
的預設實現僅匹配變體的名稱。Display
和 ToString
都返回指定的 enum
變體。這使你能夠將單元樣式變體從 enum
轉換為字串並再次轉換回來。
此外,ToString
和 Display
根據以下標準選擇適當的序列化。
- 如果存在字串屬性,將使用此值。每個版本只允許一個。
- 選擇值最長的序列化屬性。如果不需要此行為,請改用 to 字串。
- 最後,如果
serialize
和to 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(); }