Erstellen String-Enum in Rust
In diesem Artikel lernen wir, wie man String-Enumerationen in Rust erstellt.
Erstellen Enum
in Rust
In Rust stellt ein enum
Daten dar, die eine von mehreren möglichen Versionen sind. Das Schlüsselwort enum
erlaubt die Entwicklung eines Typs, der eine von mehreren möglichen Versionen sein kann.
Jede als struct
gültige Version ist auch als enum
gültig. Darüber hinaus kann jede Version im enum
optional zugehörige Daten haben:
enum Information {
Quit,
ChangeColor(i32, i32, i32),
Move { x: i32, y: i32 },
Write(String),
}
Es gibt Varianten ohne Daten, Varianten mit benannten Daten und Varianten mit anonymen Daten. Die Syntax zum Definieren von Varianten ahmt die zum Definieren von Strukturen wie Tupelstrukturen
nach.
Im Gegensatz zu individuellen Struct-Definitionen ist ein enum
ein einzelner Typ. Ein enum
-Wert kann mit jeder der Varianten übereinstimmen.
Aus diesem Grund wird ein enum
häufig auch als Summentyp bezeichnet: Die Menge möglicher enum
-Werte ist die Summe der Mengen möglicher Variantenwerte.
Wir verwenden die ::
-Syntax, um auf den Namen jeder Variante zu verweisen, der durch den Namen des enum
selbst begrenzt ist.
Strum
in Rust
Strum
ist eine Sammlung von Makros
und Eigenschaften, die das Arbeiten mit enums
und Strings in Rust
erleichtern.
EnumString
: automatische Ableitung std::str::FromStr
wird auf enum
angewendet. Jede enum
-Version stimmt mit ihrem Namen überein.
Dies kann durch Verwendung von serialize="DifferentName"
oder string="DifferentName"
für das Attribut überschrieben werden, wie unten gezeigt. Es ist möglich, viele Deserialisierungen zu derselben Variation hinzuzufügen.
Wenn die Variation zusätzliche Daten enthält, werden sie durch die Deserialisierung auf ihre Standardwerte gesetzt. Das Attribut default
kann auf eine Tupelvariation mit einem einzigen Datenparameter angewendet werden.
Die angegebene Variante wird zurückgegeben, wenn keine Übereinstimmung gefunden wird, und die Eingabezeichenfolge wird als Parameter erfasst. Hier ist ein Beispiel für Code, der durch die Vererbung EnumString
erstellt wurde.
#[derive(EnumString)]
enum Cars {
BMW,
Volvo { range:usize },
#[strum(serialize="Toyota",serialize="b")]
Toyota(usize),
#[strum(disabled="true")]
Fiat,
}
Beachten Sie, dass die Standardimplementierung von FromStr
nur mit dem Namen der Variante übereinstimmt. Sowohl Display
als auch ToString
geben die angegebene enum
-Variation zurück. Damit können Sie Unit-Style-Varianten von enum
in String und wieder zurück umwandeln.
Zudem wählen ToString
und Display
die passende Serialisierung nach folgenden Kriterien aus.
- Dieser Wert wird verwendet, wenn eine String-Eigenschaft vorhanden ist. Pro Version ist nur eine zulässig.
- Die serialisierte Eigenschaft mit dem längsten Wert wird ausgewählt. Wenn dieses Verhalten nicht erwünscht ist, verwenden Sie stattdessen to string.
- Schließlich wird der Name der Variante verwendet, wenn weder die Eigenschaften
serialize
nochto string
vorhanden sind.
Display
ist ToString
vorzuziehen Alle Typen, die ::std::fmt::Display
implementieren, haben eine Standardimplementierung von 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(); }