Az enumok és a mintaillesztés megértése alapvető fontosságú a Rustban. Fedezze fel a hatékony technikákat mindkettő megvalósítására.
A Rust különféle adattípusokat biztosít a műveletek végrehajtásához, az alapvető adattípusoktól, például karakterláncoktól, egész számoktól és lebegő adatoktól pontszámok összetett adattípusokhoz, például vektorokhoz és tömbökhöz összetett adattípusokhoz, például struktúrákhoz és felsorolásokhoz.
A felsorolások (enumerations) egy olyan adattípus, amely lehetővé teszi egy rögzített értékkészlet megjelenítését, például a hét napjait és a szivárvány színét. A felsorolások akkor hasznosak, ha egy változó lehetséges értékei korlátozottak és ismertek.
Enumok meghatározása a rozsdában
Az enumok deklarálása Rustban hasonló a enumok deklarálása C#-ban. Használni fogod a enum a nevet követő kulcsszó és egy kapcsos kapcsos készlet a felsorolások meghatározásához. A lehetséges változatokat (entitásokat) a kapcsos kapcsos zárójeleken belül vesszővel elválasztóként határozhatja meg.
Íme egy felsorolás a hét napjairól:
enumHétköznap {
Hétfő,
Kedd,
Szerda,
Csütörtök,
Péntek,
Szombat,
Vasárnap,
}
A Hétköznap Az enum a hét napjait jelöli. A változatai a nap nevei, és nincs hozzájuk kapcsolódó értékük. Ezenkívül az enum változatai bármilyenek lehetnek Rozsda adattípus.
A változatokat úgy érheti el, hogy megadja a változat nevét az enum útvonalelválasztó (::) operátorával.
hagyja nap = Hétköznap:: Hétfő;
// a `day` változó statikusan beírt változata
hagyja day: Weekday = Weekday:: Monday;
A kód megadja, hogy hozzá kíván férni a hétfő Hétköznapi enum változata.
Az enumok változatai és diszkriminánsai
Az enum változatai az úgynevezett egész értékekhez kapcsolódnak diszkriminatív. Alapértelmezés szerint a megkülönböztető értékek nullától kezdődnek, és a következő változatoknál 1-gyel nőnek; azonban lehetőség van egyéni megkülönböztető értékek megadására minden változathoz.
Íme egy példa a Weekday enum értékhez rendelt változatokkal.
enumHétköznap {
hétfő = 1,
kedd = 2,
szerda = 3,
csütörtök = 4,
péntek = 5,
szombat = 6,
vasárnap = 7,
}
A Weekday enumnak hét változata van, amelyek a hét minden napját reprezentálják, és minden naphoz hozzá van rendelve egy érték (az úgynevezett diszkrimináns). A változatok a hét első és utolsó napjának sorrendjében vannak.
A megkülönböztető értéket a változatnév használatával érheti el.
fnfő-() {
println!("Hétfő: {}", Hétköznap:: Hétfő minti32);
println!("kedd: {}", Hétköznap:: Kedd minti32);
println!("Szerda: {}", Hétköznap:: Szerda minti32);
println!("Csütörtök: {}", Hétköznap:: csütörtök minti32);
println!("Péntek: {}", Hétköznap:: Péntek minti32);
println!("Szombat: {}", Hétköznap:: Szombat minti32);
println!("Vasárnap: {}", Hétköznap:: Vasárnap minti32);
}
A println! makrót használunk a diszkriminánsok kinyomtatására. Minden nyomtatott! A makróhíváshoz két argumentum szükséges: egy formátum karakterlánc és egy érték. A formázási karakterlánc határozza meg a kimenet formázásának módját; az érték a tényleges érték, amely kinyomtatásra kerül.
Ebben az esetben a formátum karakterlánc egy karakterlánc-literál, amely a hét napjának nevét tartalmazza, az érték pedig az enum-változat explicit módon a i32 egész típusú.
Az i32-re való explicit öntvény azért szükséges, mert a Rust enumokat egész számokként ábrázolják, de az adott egész típus az enum méretétől függ. Alapértelmezés szerint a Rust a legkisebb egész számtípust rendeli hozzá, amely képes az összes megkülönböztető elemet reprezentálni a felsorolásban. De ebben az esetben az értékeket i32 egész számként szeretné kinyomtatni, ezért kifejezetten ki kell adnia őket.
Íme a futtatás eredménye fő- funkció:
Rozsda színben illeszkedő minták
A mintaillesztés egy Rust vezérlőstruktúra konstrukció, amely hasznos az adatminták azonosításához. A mintaillesztés lehetővé teszi, hogy tömör és hatékony kódot írjon a használat közben fejlett adatstruktúrák vagy összetett műveletek végzése.
Használni fogod a mérkőzés kulcsszó után a => elválasztó a mintához, illetve a minta műveletéhez. A minta bármilyen Rust kifejezés lehet, beleértve a literálokat, változókat és függvényhívásokat.
Íme egy példa egyezési nyilatkozatra:
fnfő-(){
hagyja x = 5;
mérkőzés x {
1 => println!("egy"),
2 => println!("kettő"),
3 => println!("három"),
// akkor fut, ha egyik minta sem egyezik
_ => println!("valami más"),
}
}
A fő- függvény egyezik x több mintával szemben, majd kiírja az értéket x értéke alapján. Az aláhúzás (_) minta egy helyettesítő karakterminta, amelyet gyűjtőként használnak olyan esetekre, amelyeket nem kifejezetten kezelnek.
Enumok és mintaillesztés
A felsorolások és a mintaillesztés hasznosak a fejlett adatstruktúrák típusbiztonságos és hatékony kifejezéséhez és az azokkal való munkavégzéshez. A felsorolások segítségével meghatározhat egy rögzített értékkészletet és mintaillesztést az ezekkel az értékekkel való együttműködéshez.
Íme egy sor a szivárvány színeiről:
enumSzivárvány {
Piros,
Narancs,
Sárga,
Zöld,
Kék,
Indigó,
Ibolya,
}
Minden változata a Szivárvány Az enum a szivárvány színét jelöli. Használhatja a mintaillesztést a match utasítással, hogy a mintákat a változathoz illessze, hogy a szivárvány színe alapján szabályozza a program folyamatát.
Itt van egy funkció, amely átveszi a Rainbow enum színváltozatát, és a szín alapján nyomtat üzenetet.
fnprint_color(szín: szivárvány) {
mérkőzés szín {
Szivárvány:: Piros => println!(– Piros a színe!),
Szivárvány:: Narancs => println!(– A színe narancssárga!),
Szivárvány:: Sárga => println!(– A színe sárga!),
Szivárvány:: Zöld => println!(– A színe zöld!),
Szivárvány:: Kék => println!(– A színe kék!),
Szivárvány:: Indigó => println!(– A színe indigó!),
Szivárvány:: Violet => println!(– A színe lila!),
}
}
fnfő-() {
hagyja szín = Szivárvány:: Kék;
print_color (szín);
}
Lehet kapni változatok soha nem készülnek vagy hasonló figyelmeztetéseket, amikor megpróbálja végrehajtani a fenti kódot, mert a kék változaton kívül a többi változat soha nem került összeállításra ebben a kódban. Így ebben az esetben nyugodtan figyelmen kívül hagyhatja ezeket a figyelmeztetéseket, mivel ez szándékos.
A print_color függvény a Rainbow enum típusú színparamétert veszi fel. Az egyezési nyilatkozat megegyezik egy színkészlet színével, amely a változatneveken keresztül érhető el. És végül az üzenetet a megfelelő szín alapján nyomtatja ki.
Használhat mintaillesztést összetett műveletekhez, például több visszatérési értékhez egy feltétel alapján.
fnkiszámítja a hullámhosszt(szín: Szivárvány) -> u32 {
mérkőzés szín {
Szivárvány:: Piros => 700,
Szivárvány:: Narancs => 590,
Szivárvány:: Sárga => 570,
Szivárvány:: Zöld => 510,
Szivárvány:: Kék => 475,
Szivárvány:: Indigó => 445,
Szivárvány:: Violet => 400,
}
}
A kiszámítja a hullámhosszt A függvény a Rainbow enum típusú színváltozatot veszi paraméterként, és egy előjel nélküli, 32 bites egész számot ad vissza, amely a mintának megfelelő szín hullámhossza.
A Rust struktúrákat is biztosít egyéni típusok létrehozásához
Az enumok jól használhatók egyéni típusok meghatározásához számos művelethez, különösen olyan esetekben, amikor a mezők ismertek és határozottak.
A Rust olyan struktúrákat is biztosít, amelyek segítségével egyedi típusokat hozhat létre elnevezett mezőkkel. Az enumoktól eltérően a struct-ok lehetővé teszik különböző típusú mezők meghatározását, amelyeket egyénileg érhet el és módosíthat.