Forståelse af enums og mønstertilpasning er grundlæggende i Rust. Udforsk effektive teknikker til at implementere dem begge.
Rust leverer forskellige datatyper til at udføre operationer, fra grundlæggende datatyper som strenge, heltal og flydende punkt tal til sammensatte datatyper som vektorer og arrays til sammensatte datatyper som strukturer og opregninger.
Enums (optællinger) er en datatype, der tillader repræsentation af et fast sæt værdier, såsom ugedagene og regnbuens farve. Enums er praktiske, når de mulige værdier for en variabel er begrænsede og kendte.
Definition af enums i rust
Erklæring af enums i Rust svarer til erklære enums i C#. Du vil bruge enum nøgleord efter navnet og et sæt krøllede seler til at definere opregninger. Du kan definere de mulige varianter (entiteter) inden for de krøllede klammeparenteser med et komma som separator.
Her er en oversigt over ugens dage:
enumUgedag {
Mandag,
Tirsdag,
Onsdag,
Torsdag,
Fredag,
Lørdag,
Søndag,
}
Det Ugedag enum repræsenterer ugedagene. Det
varianter er dagens navne og har ingen tilknyttede værdier. Også varianterne af din enum kan være enhver Rustdatatype.Du kan få adgang til varianter ved at angive variantnavnet ved hjælp af sti-separator-operatoren (::) på enum.
lade dag = Ugedag:: Mandag;
// statisk skrevet version af variabelen `dag`
lade dag: Ugedag = Ugedag:: Mandag;
Koden angiver, at du vil have adgang til Mandag variant af Weekday enum.
Varianter og diskriminanter af enums
Varianterne af en enum er forbundet med heltalsværdier kaldet diskriminerende. Som standard starter diskriminantværdierne ved nul og øges med 1 for efterfølgende varianter; det er dog muligt at angive brugerdefinerede diskriminantværdier for hver variant.
Her er et eksempel på Weekday-optællingen med værditildelte varianter.
enumUgedag {
mandag = 1,
tirsdag = 2,
onsdag = 3,
Torsdag = 4,
fredag = 5,
Lørdag = 6,
søndag = 7,
}
Weekday enum har syv varianter, der repræsenterer hver dag i ugen, og hver dag har en værdi (kaldet diskriminant) tildelt dem. Varianterne er i rækkefølgen fra den første til den sidste dag i ugen.
Du kan få adgang til diskriminantværdien ved at bruge variantnavnet.
fnvigtigste() {
println!("Mandag: {}", Ugedag:: Mandag somi32);
println!("Tirsdag: {}", Hverdag:: Tirsdag somi32);
println!("Onsdag: {}", Ugedag:: Onsdag somi32);
println!("Torsdag: {}", Hverdag:: Torsdag somi32);
println!("Fredag: {}", Hverdag:: Fredag somi32);
println!("Lørdag: {}", Hverdag:: Lørdag somi32);
println!("Søndag: {}", Hverdag:: Søndag somi32);
}
Det println! makro bruges til at udskrive diskriminanterne. Hver println! Makrokald kræver to argumenter: en formatstreng og en værdi. Formatstrengen angiver, hvordan outputtet skal formateres; værdien er den faktiske værdi, der bliver udskrevet.
I dette tilfælde er formatstrengen en streng-literal, der indeholder ugedagens navn, og værdien er enum-varianten med en eksplicit cast til i32 heltalstype.
Den eksplicitte cast til i32 er nødvendig, fordi Rust-enums er repræsenteret som heltal, men den specifikke heltalstype afhænger af størrelsen af enum. Som standard tildeler Rust den mindste heltalstype, der kan repræsentere alle diskriminanterne i enummet. Men i dette tilfælde vil du udskrive værdierne som i32-heltal, så du skal caste dem eksplicit.
Her er resultatet af at køre vigtigste fungere:
Mønstre, der matcher i rust
Mønstermatching er en rustkontrolstrukturkonstruktion, der er nyttig til at identificere datamønstre. Mønstermatching gør det muligt at skrive kortfattet og effektiv kode, mens du arbejder med avancerede datastrukturer eller udføre komplekse operationer.
Du vil bruge match søgeord efterfulgt af => separator for henholdsvis mønsteret og operationen for mønsteret. Mønsteret kan være et hvilket som helst Rust-udtryk, inklusive bogstaver, variabler og funktionskald.
Her er et eksempel på matcherklæring:
fnvigtigste(){
lade x = 5;
match x {
1 => println!("en"),
2 => println!("to"),
3 => println!("tre"),
// kører, hvis ingen af mønstrene matcher
_ => println!("noget andet"),
}
}
Det vigtigste funktion matcher x mod flere mønstre og udskriver derefter værdien baseret på værdien af x. Understregningsmønsteret (_) er et wild card-mønster, der bruges som en catch-all for sager, der ikke eksplicit håndteres.
Enums og mønstertilpasning
Enums og mønstermatchning er nyttige til at udtrykke og arbejde med avancerede datastrukturer på en typesikker og effektiv måde. Du kan bruge enums til at definere et fast sæt værdier og mønstermatchning for at arbejde med disse værdier.
Her er en oversigt over farverne i en regnbue:
enumRegnbue {
Rød,
Orange,
Gul,
Grøn,
Blå,
Indigo,
Violet,
}
Hver variant af Regnbue enum repræsenterer en farve på regnbuen. Du kan bruge mønstertilpasning med matcherklæringen til at matche mønstre mod varianten for at styre programmets flow baseret på regnbuens farve.
Her er en funktion, der tager farvevarianten fra Rainbow enum ind og udskriver en besked baseret på farven.
fnprint_color(farve: regnbue) {
match farve {
Regnbue:: Rød => println!("Farven er rød!"),
Regnbue:: Orange => println!("Farven er orange!"),
Regnbue:: Gul => println!("Farven er gul!"),
Regnbue:: Grøn => println!("Farven er grøn!"),
Regnbue:: Blå => println!("Farven er blå!"),
Rainbow:: Indigo => println!("Farven er indigo!"),
Regnbue:: Violet => println!("Farven er violet!"),
}
}
fnvigtigste() {
lade farve = Regnbue:: Blå;
print_color (farve);
}
Du kan få varianter er aldrig konstrueret eller lignende advarsler, når du vil forsøge at udføre ovenstående kode, fordi de andre varianter bortset fra den blå variant aldrig blev konstrueret i denne kode. Derfor kan du i dette tilfælde roligt ignorere disse advarsler, da det er med vilje.
Det print_color funktionen indtager en farveparameter af typen Rainbow enum. Matcherklæringen matcher farven fra en suite af farver, der tilgås via variantnavnene. Og endelig udskrives beskeden ud fra den matchede farve.
Du kan bruge mønstermatchning til komplekse operationer som flere returværdier baseret på en betingelse.
fnberegne_bølgelængde(farve: Regnbue) -> u32 {
match farve {
Regnbue:: Rød => 700,
Regnbue:: Orange => 590,
Regnbue:: Gul => 570,
Regnbue:: Grøn => 510,
Regnbue:: Blå => 475,
Rainbow:: Indigo => 445,
Regnbue:: Violet => 400,
}
}
Det beregne_bølgelængde funktionen tager en farvevariant af Rainbow enum-typen ind som en parameter og returnerer et 32-bit heltal uden fortegn, der er bølgelængden af farven, der matcher mønsteret.
Rust giver også strukturer til at skabe brugerdefinerede typer
Enums er praktiske til at definere brugerdefinerede typer for flere operationer, især i tilfælde, hvor felterne er kendte og bestemte.
Rust giver også strukturer, som du kan bruge til at oprette brugerdefinerede typer med navngivne felter. I modsætning til enums giver strukturer dig mulighed for at definere felter af forskellige typer, som du kan få adgang til og ændre individuelt.