Pochopení výčtů a porovnávání vzorů je v Rustu zásadní. Prozkoumejte účinné techniky pro implementaci obou.

Rust poskytuje různé datové typy pro provádění operací, od základních datových typů, jako jsou řetězce, celá čísla a plovoucí ukazovat čísla na složené datové typy, jako jsou vektory a pole, na složené datové typy, jako jsou struktury a výčty.

Enums (enumerations) je datový typ, který umožňuje reprezentaci pevné sady hodnot, jako jsou dny v týdnu a barva duhy. Výčty jsou užitečné, když jsou možné hodnoty proměnné omezené a známé.

Definování enumů v Rustu

Deklarace výčtů v Rustu je podobná deklarování výčtů v C#. Budete používat enum klíčové slovo za jménem a sadu složených závorek k definování výčtů. Možné varianty (entity) ve složených závorkách můžete definovat čárkou jako oddělovačem.

Zde je výčet dnů v týdnu:

enumVšední den {
Pondělí,
Úterý,
Středa,
Čtvrtek,
Pátek,
Sobota,
Neděle,
}

The Všední den enum představuje dny v týdnu. The varianty jsou názvy dne a nemají žádné přidružené hodnoty. Také varianty vašeho výčtu mohou být libovolné Datový typ Rust.

instagram viewer

K variantám můžete přistupovat zadáním názvu varianty pomocí operátoru oddělovače cesty (::) ve výčtu.

nechat den = Den v týdnu:: pondělí;

// staticky typovaná verze proměnné `day`
nechat den: Weekday = Weekday:: Monday;

Kód určuje, že chcete získat přístup k pondělí varianta výčtu Weekday.

Varianty a diskriminanty výčtů

Varianty výčtu jsou spojeny s tzv. celočíselnými hodnotami diskriminační. Ve výchozím nastavení začínají diskriminační hodnoty na nule a pro následující varianty se zvýší o 1; je však možné zadat vlastní diskriminační hodnoty pro každou variantu.

Zde je příklad výčtu Weekday s variantami s přiřazenou hodnotou.

enumVšední den {
pondělí = 1,
úterý = 2,
Středa = 3,
čtvrtek = 4,
pátek = 5,
Sobota = 6,
neděle = 7,
}

Enum Weekday má sedm variant reprezentujících každý den v týdnu a každý den má přiřazenou hodnotu (nazývanou diskriminant). Varianty jsou v pořadí od prvního do posledního dne v týdnu.

K diskriminační hodnotě můžete přistupovat pomocí názvu varianty.

fnhlavní() {
println!("Pondělí: {}", Den v týdnu:: Pondělí tak jakoi32);
println!("Úterý: {}", Den v týdnu:: úterý tak jakoi32);
println!("Středa: {}", Den v týdnu:: Středa tak jakoi32);
println!("Čtvrtek: {}", Den v týdnu:: čtvrtek tak jakoi32);
println!("Pátek: {}", Den v týdnu:: Pátek tak jakoi32);
println!("Sobota: {}", Den v týdnu:: Sobota tak jakoi32);
println!("Neděle: {}", Den v týdnu:: Neděle tak jakoi32);
}

The println! makro se používá k tisku diskriminantů. Každý tiskln! vyvolání makra má dva argumenty: formátovací řetězec a hodnotu. Formátovací řetězec určuje, jak formátovat výstup; hodnota je skutečná hodnota, která se vytiskne.

V tomto případě je formátovacím řetězcem řetězcový literál, který obsahuje název dne v týdnu, a hodnotou je varianta enum s explicitním přetypováním na i32 celočíselný typ.

Explicitní přetypování na i32 je nezbytné, protože výčty Rust jsou reprezentovány jako celá čísla, ale konkrétní typ celého čísla závisí na velikosti výčtu. Ve výchozím nastavení Rust přiřadí typ nejmenšího celého čísla, který může reprezentovat všechny diskriminanty ve výčtu. V tomto případě však chcete vytisknout hodnoty jako celá čísla i32, takže je musíte explicitně přetypovat.

Zde je výsledek ze spuštění hlavní funkce:

Vzory odpovídající v rzi

Porovnávání vzorů je konstrukce struktury kontroly rzi užitečná pro identifikaci vzorů dat. Porovnávání vzorů umožňuje psát stručný a efektivní kód při práci s ním pokročilé datové struktury nebo provádění složitých operací.

Budete používat zápas klíčové slovo následované => oddělovač pro vzor a operaci pro vzor. Vzorem může být jakýkoli výraz Rust, včetně literálů, proměnných a volání funkcí.

Zde je příklad prohlášení o shodě:

fnhlavní(){
nechat x = 5;
zápas X {
1 => println!("jeden"),
2 => println!("dva"),
3 => println!("tři"),

// se spustí, pokud se žádný ze vzorů neshoduje
_ => println!("něco jiného"),
}
}

The hlavní funkce odpovídá X proti několika vzorům a poté vytiskne hodnotu na základě hodnoty x. Vzor podtržítka (_) je vzor zástupného znaku, který se používá jako záchytný bod pro případy, které nejsou explicitně řešeny.

Výčty a porovnávání vzorů

Výčty a porovnávání vzorů jsou užitečné pro vyjádření a práci s pokročilými datovými strukturami typově bezpečným a efektivním způsobem. Výčty můžete použít k definování pevné sady hodnot a porovnávání vzorů pro práci s těmito hodnotami.

Zde je výčet barev v duze:

enumDuha {
Červené,
Oranžový,
Žlutá,
Zelená,
Modrý,
Indigo,
Fialový,
}

Každá varianta Duha enum představuje barvu duhy. Můžete použít porovnávání vzorů s příkazem match k porovnání vzorů s variantou a řídit tok programu na základě barvy duhy.

Zde je funkce, která převezme barevnou variantu z výčtu Rainbow a vytiskne zprávu na základě barvy.

fnbarva_tisku(barva: Rainbow) {
zápas barva {
Duha:: Červená => println!("Barva je červená!"),
Duha:: Oranžová => println!("Barva je oranžová!"),
Duha:: Žlutá => println!("Barva je žlutá!"),
Duha:: Zelená => println!("Barva je zelená!"),
Duha:: Modrá => println!("Barva je modrá!"),
Rainbow:: Indigo => println!("Barva je indigová!"),
Duha:: Fialová => println!("Barva je fialová!"),
}
}

fnhlavní() {
nechat barva = Duha:: Modrá;
barva_tisku (barva);
}

Můžete dostat varianty se nikdy nekonstruují nebo podobná varování, když se pokusíte spustit výše uvedený kód, protože ostatní varianty kromě modré varianty nebyly v tomto kódu nikdy vytvořeny. V tomto případě tedy můžete tato varování bezpečně ignorovat, protože je to záměrné.

The barva_tisku funkce přebírá parametr barvy typu Rainbow enum. Prohlášení o shodě odpovídá barvě ze sady barev, které jsou přístupné prostřednictvím názvů variant. A nakonec se zpráva vytiskne na základě odpovídající barvy.

Porovnávání vzorů můžete použít pro složité operace, jako je více návratových hodnot na základě podmínky.

fnvypočítat_vlnovou délku(barva: Rainbow) -> u32 {
zápas barva {

Duha:: Červená => 700,
Duha:: Oranžová => 590,
Duha:: Žlutá => 570,
Duha:: Zelená => 510,
Duha:: Modrá => 475,
Rainbow:: Indigo => 445,
Duha:: Fialová => 400,
}
}

The vypočítat_vlnovou délku funkce bere jako parametr barevnou variantu typu Rainbow enum a vrací 32bitové celé číslo bez znaménka, což je vlnová délka barvy, která odpovídá vzoru.

Rust také poskytuje struktury pro vytváření vlastních typů

Výčty jsou užitečné pro definování vlastních typů pro několik operací, zejména v případech, kdy jsou pole známá a určitá.

Rust také poskytuje struktury, které můžete použít k vytvoření vlastních typů s pojmenovanými poli. Na rozdíl od výčtů vám struktury umožňují definovat pole různých typů, ke kterým můžete přistupovat a upravovat je jednotlivě.