Erstellen String-Enum in Rust

Nilesh Katuwal 18 August 2022
  1. Erstellen Enum in Rust
  2. Strum in Rust
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.

  1. Dieser Wert wird verwendet, wenn eine String-Eigenschaft vorhanden ist. Pro Version ist nur eine zulässig.
  2. Die serialisierte Eigenschaft mit dem längsten Wert wird ausgewählt. Wenn dieses Verhalten nicht erwünscht ist, verwenden Sie stattdessen to string.
  3. Schließlich wird der Name der Variante verwendet, wenn weder die Eigenschaften serialize noch to 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(); }

Verwandter Artikel - Rust String