Razumijevanje enuma i podudaranja uzoraka temeljno je u Rustu. Istražite učinkovite tehnike za implementaciju oba.
Rust pruža različite vrste podataka za izvođenje operacija, od osnovnih vrsta podataka kao što su nizovi, cijeli brojevi i plutajući usmjerite brojeve na složene tipove podataka poput vektora i nizova na složene tipove podataka poput struktura i enumeracija.
Enumeri (nabrajanja) su tip podataka koji omogućuje reprezentaciju fiksnog skupa vrijednosti, poput dana u tjednu i dugine boje. Enumi su korisni kada su moguće vrijednosti za varijablu ograničene i poznate.
Definiranje enuma u Rustu
Deklariranje enuma u Rustu je slično deklariranje enuma u C#. Vi ćete koristiti nabrajanje ključna riječ koja slijedi iza imena i skup vitičastih zagrada za definiranje nabrajanja. Moguće varijante (entitete) možete definirati unutar vitičastih zagrada sa zarezom kao razdjelnikom.
Evo popisa dana u tjednu:
nabrajanjeradni dan {
Ponedjeljak,
Utorak,
Srijeda,
Četvrtak,
Petak,
Subota,
Nedjelja,
}
The
radni dan enum predstavlja dane u tjednu. The varijante su imena dana i nemaju pridružene vrijednosti. Također, varijante vašeg popisa mogu biti bilo koje Vrsta podataka Rust.Možete pristupiti varijantama navođenjem naziva varijante pomoću operatora za razdvajanje staze (::) na enumu.
neka dan = radni dan:: ponedjeljak;
// statički tipizirana verzija varijable `dan`
neka dan: radni dan = radni dan:: ponedjeljak;
Kod označava da želite pristupiti ponedjeljak varijanta Weekday enum.
Varijante i diskriminanti enuma
Varijante enuma pridružene su cjelobrojnim vrijednostima tzv diskriminirajući. Prema zadanim postavkama, diskriminativne vrijednosti počinju od nule i povećavaju se za 1 za sljedeće varijante; međutim, moguće je navesti prilagođene diskriminativne vrijednosti za svaku varijantu.
Evo primjera Weekday enuma s varijantama dodijeljenih vrijednosti.
nabrajanjeradni dan {
ponedjeljak = 1,
utorak = 2,
srijeda = 3,
četvrtak = 4,
petak = 5,
subota = 6,
nedjelja = 7,
}
Weekday enum ima sedam varijanti koje predstavljaju svaki dan u tjednu, a svaki dan ima dodijeljenu vrijednost (koja se zove diskriminant). Varijante su poredane od prvog do zadnjeg dana u tjednu.
Možete pristupiti diskriminantnoj vrijednosti koristeći naziv varijante.
fnglavni() {
println!("Ponedjeljak: {}", Radni dan:: ponedjeljak kaoi32);
println!("Utorak: {}", radni dan:: utorak kaoi32);
println!("Srijeda: {}", radni dan:: srijeda kaoi32);
println!("Četvrtak: {}", radni dan:: četvrtak kaoi32);
println!("Petak: {}", radni dan:: petak kaoi32);
println!("Subota: {}", Radni dan:: subota kaoi32);
println!("Nedjelja: {}", Radni dan:: nedjelja kaoi32);
}
The println! makro se koristi za ispis diskriminanata. Svaki ispis! makro pozivanje uzima dva argumenta: niz formata i vrijednost. Niz formata navodi kako formatirati izlaz; vrijednost je stvarna vrijednost koja se ispisuje.
U ovom slučaju, niz formata je literal niza koji sadrži naziv dana u tjednu, a vrijednost je varijanta enuma s eksplicitnim pretvaranjem u i32 cjelobrojni tip.
Eksplicitno pretvaranje u i32 je neophodno jer su Rust enumi predstavljeni kao cijeli brojevi, ali specifični tip cijelog broja ovisi o veličini enuma. Prema zadanim postavkama, Rust dodjeljuje najmanji tip cijelog broja koji može predstavljati sve diskriminante u enumu. Ali u ovom slučaju, želite ispisati vrijednosti kao i32 cijele brojeve, tako da ih morate eksplicitno pretvoriti.
Ovo je rezultat pokretanja glavni funkcija:
Usklađivanje uzoraka u Rustu
Usklađivanje uzorka konstrukcija je kontrolne strukture Rusta korisna za prepoznavanje obrazaca podataka. Usklađivanje uzorka omogućuje pisanje sažetog i učinkovitog koda tijekom rada napredne strukture podataka ili izvođenje složenih operacija.
Vi ćete koristiti odgovarati ključna riječ iza koje slijedi => separator za uzorak i operacija za uzorak. Uzorak može biti bilo koji Rust izraz, uključujući literale, varijable i pozive funkcija.
Evo primjera izjave o podudaranju:
fnglavni(){
neka x = 5;
odgovarati x {
1 => println!("jedan"),
2 => println!("dva"),
3 => println!("tri"),
// pokreće se ako nijedan od uzoraka ne odgovara
_ => println!("nešto drugo"),
}
}
The glavni funkcija odgovara x prema nekoliko uzoraka, a zatim ispisuje vrijednost na temelju vrijednosti x. Uzorak podvlake (_) je uzorak zamjenskog znaka koji se koristi kao sveobuhvatni za slučajeve koji nisu eksplicitno obrađeni.
Enumi i slaganje uzoraka
Enum i podudaranje uzoraka korisni su za izražavanje i rad s naprednim strukturama podataka na siguran i učinkovit način. Možete koristiti enume za definiranje fiksnog skupa vrijednosti i podudaranje uzoraka za rad s tim vrijednostima.
Evo popisa duginih boja:
nabrajanjeDuga {
Crvena,
Naranča,
Žuta boja,
zelena,
plavo,
Indigo,
ljubičasta,
}
Svaka varijanta od Duga enum predstavlja boju duge. Možete koristiti podudaranje uzoraka s naredbom za podudaranje za podudaranje uzoraka s varijantom za kontrolu tijeka programa na temelju dugine boje.
Evo funkcije koja preuzima varijantu boje iz Rainbow enuma i ispisuje poruku na temelju boje.
fnboja_ispisa(boja: duga) {
odgovarati boja {
Duga:: Crvena => println!("Boja je crvena!"),
Duga:: Narančasta => println!("Boja je narančasta!"),
Duga:: Žuta => println!("Boja je žuta!"),
Duga:: Zelena => println!("Boja je zelena!"),
Duga:: Plava => println!("Boja je plava!"),
Duga:: Indigo => println!("Boja je indigo!"),
Duga:: Ljubičasta => println!("Boja je ljubičasta!"),
}
}
fnglavni() {
neka boja = Rainbow:: Blue;
print_color (boja);
}
Možda ćete dobiti varijante se nikada ne konstruiraju ili slična upozorenja kada ćete pokušati izvršiti gornji kod jer druge varijante osim Plave varijante nikada nisu konstruirane u ovom kodu. Stoga, u ovom slučaju, možete sigurno zanemariti ova upozorenja jer su namjerna.
The boja_ispisa funkcija uzima parametar boje tipa Rainbow enum. Izjava podudaranja odgovara boji iz skupa boja kojima se pristupa putem naziva varijanti. I na kraju, poruka se ispisuje na temelju usklađene boje.
Možete koristiti podudaranje uzoraka za složene operacije kao što su više povratnih vrijednosti na temelju uvjeta.
fnizračunati_valnu duljinu(boja: Rainbow) -> u32 {
odgovarati boja {
Duga:: Crvena => 700,
Duga:: Narančasta => 590,
Duga:: Žuta => 570,
Duga:: Zelena => 510,
Duga:: Plava => 475,
Duga:: Indigo => 445,
Duga:: Ljubičasta => 400,
}
}
The izračunati_valnu duljinu funkcija uzima varijantu boje tipa Rainbow enum kao parametar i vraća 32-bitni cijeli broj bez predznaka koji je valna duljina boje koja odgovara uzorku.
Rust također pruža strukture za stvaranje prilagođenih tipova
Enumi su zgodni za definiranje prilagođenih tipova za nekoliko operacija, posebno u slučajevima kada su polja poznata i definitivna.
Rust također nudi strukture koje možete koristiti za stvaranje prilagođenih tipova s imenovanim poljima. Za razliku od enuma, strukture vam omogućuju da definirate polja različitih tipova kojima možete pojedinačno pristupiti i mijenjati ih.