Razumevanje enumov in ujemanja vzorcev je v Rustu temeljnega pomena. Raziščite učinkovite tehnike za izvajanje obeh.
Rust ponuja različne tipe podatkov za izvajanje operacij, od osnovnih tipov podatkov, kot so nizi, cela števila in plavajoče številke na sestavljene podatkovne tipe, kot so vektorji in nizi, na sestavljene podatkovne tipe, kot so strukture in enumeracije.
Enumeri (naštevanja) so podatkovni tip, ki omogoča predstavitev fiksnega niza vrednosti, kot so dnevi v tednu in barva mavrice. Enumi so priročni, ko so možne vrednosti za spremenljivko omejene in znane.
Definiranje enumov v Rust
Deklaracija enumov v Rustu je podobna deklaracija enumov v C#. Uporabili boste enum ključna beseda, ki sledi imenu, in niz zavitih oklepajev za definiranje naštevanj. V zavitih oklepajih lahko določite možne različice (entitete) z vejico kot ločilom.
Tukaj je seznam dni v tednu:
enumDelovni dan {
ponedeljek,
torek,
sreda,
četrtek,
petek,
sobota,
nedelja,
}
The Delovni dan enum predstavlja dneve v tednu. The
različice so imena dneva in nimajo povezanih vrednosti. Tudi različice vašega enuma so lahko poljubne Vrsta podatkov Rust.Do različic lahko dostopate tako, da podate ime različice z uporabo operatorja ločila poti (::) na enum.
pustiti dan = dan v tednu:: ponedeljek;
// statično tipizirana različica spremenljivke `dan`
pustiti dan: dan v tednu = dan v tednu:: ponedeljek;
Koda navaja, da želite dostopati do ponedeljek različica enum Weekday.
Variante in diskriminante enumov
Različice enuma so povezane s celimi vrednostmi, imenovanimi diskriminator. Privzeto se diskriminantne vrednosti začnejo pri nič in se pri naslednjih različicah povečajo za 1; vendar je mogoče za vsako različico določiti diskriminantne vrednosti po meri.
Tukaj je primer naštevanja Weekday z različicami, dodeljenimi vrednostmi.
enumDelovni dan {
ponedeljek = 1,
torek = 2,
sreda = 3,
četrtek = 4,
petek = 5,
sobota = 6,
nedelja = 7,
}
Enum Weekday ima sedem različic, ki predstavljajo vsak dan v tednu, in vsakemu dnevu je dodeljena vrednost (imenovana diskriminant). Različice so po vrstnem redu od prvega do zadnjega dne v tednu.
Do diskriminantne vrednosti lahko dostopate z imenom različice.
fnglavni() {
println!("Ponedeljek: {}", Delovni dan:: ponedeljek koti32);
println!("Torek: {}", Delovni dan:: torek koti32);
println!("Sreda: {}", Delovni dan:: sreda koti32);
println!("Četrtek: {}", Delovnik:: četrtek koti32);
println!("Petek: {}", Delovnik:: petek koti32);
println!("Sobota: {}", Delovni dan:: sobota koti32);
println!("Nedelja: {}", Delovni dan:: nedelja koti32);
}
The println! makro se uporablja za tiskanje diskriminant. Vsak natis! priklic makra sprejme dva argumenta: formatni niz in vrednost. Niz formata določa, kako formatirati izhod; vrednost je dejanska vrednost, ki se natisne.
V tem primeru je formatni niz literal niza, ki vsebuje ime dneva v tednu, vrednost pa je različica enum z eksplicitno pretvorbo v i32 celoštevilski tip.
Eksplicitna pretvorba v i32 je potrebna, ker so enumi Rust predstavljeni kot cela števila, vendar je specifični tip celega števila odvisen od velikosti enuma. Privzeto Rust dodeli najmanjši celoštevilski tip, ki lahko predstavlja vse diskriminante v enumu. Toda v tem primeru želite vrednosti natisniti kot cela števila i32, zato jih morate izrecno uvesti.
Tukaj je rezultat izvajanja glavni funkcija:
Ujemanje vzorcev v Rustu
Ujemanje vzorcev je konstrukt nadzorne strukture Rust, uporaben za prepoznavanje podatkovnih vzorcev. Ujemanje vzorcev omogoča pisanje jedrnate in učinkovite kode med delovanjem napredne podatkovne strukture ali izvajanje kompleksnih operacij.
Uporabili boste tekma ključna beseda, ki ji sledi => ločilo za vzorec oziroma operacijo za vzorec. Vzorec je lahko kateri koli izraz Rust, vključno z literali, spremenljivkami in klici funkcij.
Tukaj je primer izjave o ujemanju:
fnglavni(){
pustiti x = 5;
tekma x {
1 => println!("ena"),
2 => println!("dva"),
3 => println!("tri"),
// zažene, če se nobeden od vzorcev ne ujema
_ => println!("nekaj drugega"),
}
}
The glavni funkcijska ujemanja x proti več vzorcem in nato natisne vrednost na podlagi vrednosti x. Vzorec podčrtaja (_) je vzorec nadomestnega znaka, ki se uporablja kot vseobsegajoč primer za primere, ki niso izrecno obravnavani.
Enumi in ujemanje vzorcev
Enumi in ujemanje vzorcev so uporabni za izražanje in delo z naprednimi podatkovnimi strukturami na tipsko varen in učinkovit način. Enume lahko uporabite za definiranje fiksnega nabora vrednosti in ujemanje vzorcev za delo s temi vrednostmi.
Tukaj je enum za barve v mavrici:
enumMavrica {
Rdeča,
oranžna,
rumena,
Zelena,
modra,
indigo,
vijolična,
}
Vsaka različica Mavrica enum predstavlja barvo mavrice. Uporabite lahko ujemanje vzorcev s stavkom ujemanja, da ujemate vzorce z različico, da nadzirate tok programa na podlagi barve mavrice.
Tukaj je funkcija, ki sprejme barvno različico iz enuma Rainbow in natisne sporočilo glede na barvo.
fnbarva_tiska(barva: mavrica) {
tekma barva {
Mavrica:: Rdeča => println!("Barva je rdeča!"),
Mavrica:: Oranžna => println!("Barva je oranžna!"),
Mavrica:: Rumena => println!("Barva je rumena!"),
Mavrica:: Zelena => println!("Barva je zelena!"),
Mavrica:: Modra => println!("Barva je modra!"),
Mavrica:: Indigo => println!("Barva je indigo!"),
Mavrica:: Vijolična => println!("Barva je vijolična!"),
}
}
fnglavni() {
pustiti barva = mavrica:: modra;
barva_tiska (barva);
}
Morda boste dobili variante niso nikoli izdelane ali podobna opozorila, ko boste poskušali izvesti zgornjo kodo, ker druge različice razen modre različice niso bile nikoli izdelane v tej kodi. Tako lahko v tem primeru varno prezrete ta opozorila, saj je namerno.
The barva_tiska funkcija sprejme barvni parameter vrste enum Rainbow. Stavek ujemanja se ujema z barvo iz nabora barv, do katerih dostopate prek imen različic. In končno, sporočilo se natisne glede na izbrano barvo.
Ujemanje vzorcev lahko uporabite za zapletene operacije, kot je več vrnjenih vrednosti na podlagi pogoja.
fnizračunaj_valovno dolžino(barva: mavrična) -> u32 {
tekma barva {
Mavrica:: Rdeča => 700,
Mavrica:: Oranžna => 590,
Mavrica:: Rumena => 570,
Mavrica:: Zelena => 510,
Mavrica:: Modra => 475,
Mavrica:: Indigo => 445,
Mavrica:: Vijolična => 400,
}
}
The izračunaj_valovno dolžino funkcija vzame barvno različico vrste enum Rainbow kot parameter in vrne nepredznačeno 32-bitno celo število, ki je valovna dolžina barve, ki se ujema z vzorcem.
Rust nudi tudi strukture za ustvarjanje vrst po meri
Enumi so priročni za definiranje tipov po meri za več operacij, zlasti v primerih, ko so polja znana in določena.
Rust ponuja tudi strukture, ki jih lahko uporabite za ustvarjanje vrst po meri z imenovanimi polji. Za razliko od enumov vam strukture omogočajo definiranje polj različnih vrst, do katerih lahko dostopate in jih spreminjate posamično.