在 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(); }