A Rust nem támogatja az OOP-t, de ezeket a technikákat mindenesetre használhatja a paradigma előnyeinek kihasználására.
Az objektum-orientált programozás (OOP) leegyszerűsíti a szoftvertervezést azáltal, hogy hangsúlyozza az objektumok használatát a valós entitások és fogalmak ábrázolására. Az OOP elősegíti a karbantarthatóságot azáltal, hogy a funkciókat objektumokba zárja be.
A Rust egy rugalmas nyelv, amely támogatja a funkcionális és eljárási programozást. Bár natívan nem támogatja az objektum-orientált programozást, megvalósíthatja az OOP koncepciókat a Rust beépített adattípusainak használatával.
Tokozás rozsdába
A beágyazás azt jelenti, hogy a kódot önálló egységekre kell rendezni, amelyek elrejtik a belső részleteket nyilvános interfész biztosítása a külső interakció számára a bonyolultság minimalizálása és a kód javítása érdekében karbantarthatóság.
A Rust kódot modulokkal is beágyazhatja. A modul elemek gyűjteménye, beleértve a függvényeket, struktúrákat, enumokat és konstansokat. A Rust modulok funkcionalitást biztosítanak a program részei közötti csoportosításhoz és határok meghatározásához.
Modulok használata adatok és funkciók beágyazására
A modul segítségével definiálhat mod kulcsszó után egy név:
mod my_module {
// a modulelemek ide kerülnek
}
A modulokat hierarchikusan rendezheti deklarációik egymásba ágyazásával:
mod szülő_modul {
mod my_module {
// a modulelemek ide kerülnek
}
}
Ezután hivatkozhat a beágyazott modulokra a teljes hierarchiával, az egyes modulokat kettős kettősponttal elválasztva, például, szülő_modul:: saját_modul.
Alapértelmezés szerint a modulokon belüli elemek privátak, és csak az ugyanazon a modulon belüli kód számára érhetők el. De a modulokat nyilvánossá teheti a kocsma kulcsszó:
mod my_module {
kocsmafnmy_function() {
// függvénytest megy ide
}
}
Ezután hozzáférhet my_function programod más részeiből.
Jellemzők használata viselkedések meghatározására
Egy másik módja annak, hogy a Rust lehetővé teszi a tokozást, a tulajdonságok használata. A tulajdonságok olyan viselkedéseket határoznak meg, amelyeket a típusok megvalósíthatnak, és biztosítják, hogy a különböző típusok ugyanahhoz a felülethez illeszkedjenek.
kocsmajellemvonásNyomtatható {
fnnyomtatás(&maga);
}kocsmastructMyType {
// struct mezőket ide
}
impl Nyomtatható számára MyType {
fnnyomtatás(&maga) {
// megvalósítás itt
}
}
A Nyomtatható tulajdonsága van a nyomtatás módszer, és a MyType struct valósítja meg a Nyomtatható vonás megvalósításával a nyomtatás módszer.
A tulajdonságok használatával biztosíthatja, hogy bármely típus, amely megvalósítja a Nyomtatható tulajdonsága van a nyomtatás módszer. Ez akkor hasznos, ha olyan általános kóddal dolgozik, amelynek együtt kell működnie a különböző típusokkal, amelyek közös viselkedést mutatnak.
Öröklés Rozsdában
Az öröklődés lehetővé teszi egy osztály meghatározását egy másik osztály alapján. Az alosztály örökli a szülő tulajdonságait és metódusait.
A Rust-ban arra ösztönzik, hogy öröklés helyett kompozíciót használjon. A kompozíció új objektumok létrehozásának folyamata a meglévők kombinálásával. Ahelyett, hogy új osztályt hozna létre, amely az alaposztály funkcionalitását örökli, létrehozhat egy új struktúrát, amely tartalmazza az alapstruktúra egy példányát és annak mezőit.
Új típusok létrehozása a meglévő típusok kombinálásával
Új típusok létrehozásához enumokat és struktúrákat fog használni. Az enumok hasznosak a véges értékű típusok számára, és a struktúrák több mezőt is tartalmazhatnak.
Létrehozhat egy enum típust különböző típusú állatokhoz.
enumÁllat {
Macska,
Kutya,
Madár,
// ...
}
Alternatív megoldásként létrehozhat egy struktúrát, amely minden állattípushoz mezőket tartalmaz. A szerkezetek enumokat és más típusokat tartalmazhatnak.
structÁllat {
név: Húr,
kor: u8,
animal_type: AnimalType,
}
enumAnimalType {
Macska,
Kutya,
Madár,
// ...
}
A Állat struct értékeit tartalmazza AnimalType felsorolás típusa.
Használhatja a tulajdonságokat az öröklődés megvalósítására és viselkedés hozzáadására egy típushoz anélkül, hogy újat hozna létre.
jellemvonásLégy {
fnlégy(&maga);
}
Így valósíthatja meg a Légy tulajdonság több típushoz.
structMadár {
név: Húr,
szárnyfesztávolság: f32,
}impl Légy számára madár {
fnlégy(&maga) {
println!("{} repül!", maga.név);
}
}structRepülőgép {
modell: Húr,
teljes sebesség: u32,
}
impl Légy számára Repülőgép {
fnlégy(&maga) {
println!("{} repül!", maga.modell);
}
}
A Madár és Repülőgép struktúrák valósítják meg a Légy vonás és nyomtatási karakterláncok a Println! makró.
Felhívhatja a légy módszert mindkét struktúrán anélkül, hogy ismernénk a konkrét típusukat.
fnfő-() {
hagyja madár = madár {
név: Húr::tól től("Sas"),
szárnyfesztávolság: 2.0,
};hagyja sík = sík {
modell: Húr::tól től("Boeing 747"),
teljes sebesség: 900,
};hagyja flying_objects: Vecdyn Fly> = vec![&madár, &repülő];
számára tárgy ban ben repülő_objektumok {
object.fly();
}
}
A fő- függvény példányosítja a Repülőgép és Madár típusok. A repülő_tárgyak vektor az objektumpéldányok vektora, és a számára hurok áthalad a vektoron, és meghívja a légy módszert a példányokon.
A polimorfizmus megvalósítása rozsdában
Egy osztály vagy típus az polimorf, ha több típus képvisel egy interfészt. Mivel a tulajdonságok biztosítják a funkcionalitást a Rust viselkedésének meghatározásához, miközben közös felületet biztosítanak az általános kód írásához, a Jellemzők segítségével megvalósíthatja a polimorfizmust.
Itt van egy elnevezett tulajdonság Rajzolható amely meghatározza az objektumok képernyőn való megjelenítésének viselkedését:
jellemvonásRajzolható {
fnhúz(&maga);
}
A Rajzolható tulajdonságot megvalósító típusok hozzáférhetnek a húz funkció.
structTéglalap {
szélesség: u32,
magasság: u32,
}
impl Rajzolható számára Téglalap {
fnhúz(&maga) {
// A téglalap megjelenítése a képernyőn
}
}
Írhat általános kódot, amely olyan objektumokat rajzol, amelyek megvalósítják a Rajzolható jellemvonás.
fnrajzol_objektum(objektum: &T) {
object.draw();
}
A rajzol_objektum függvény általános típust vesz fel T
bemenetként, amely megvalósítja a Rajzolható vonás és hívja a húz módszer a tulajdonságon. Különböző objektumok hajthatják végre a Rajzolható tulajdonságot, és hozzáférhet a funkciókhoz.
Absztrakció megvalósítása rozsdában
Az absztrakció az OOP fogalom ahol az osztályok és interfészek elérhetők meghatározott objektumok és típusok számára. Rusztban az absztrakciót tulajdonságokkal valósíthatja meg.
Íme egy példa a médialejátszó jellemzőire:
jellemvonásMédia {
fnjáték(&maga);
}
Struktúrák és enumok, amelyek megvalósítják a Média A tulajdonságnak megvalósítást kell biztosítania a játék módszer.
structDal {
cím: Húr,
művész: Húr,
}
impl Média számára Dal {
fnjáték(&maga) {
println!("Dal lejátszása: {}, szerző: {}", maga.cím, maga.művész);
}
}
A Dal struct valósítja meg a Média vonás megvalósítását biztosítva a játék metódus, amely üzenetet nyomtat a mezőivel Dal struktúrákat a konzolhoz.
fnfő-() {
// Hozzon létre egy példányt a Song struktúrából
hagyja dal = Song {
cím: Húr::tól től("Bohém Rapszódia"),
művész: Húr::tól től("Királynő"),
};
// Hívja meg a lejátszási metódust a dalpéldányon
dal.play();
}
A dal változó a Dal struct, és a változó elérheti és meghívhatja a játék módszer.
A Rust Code rendszerezése egyszerű
Az objektum-orientált programozás segít a kódszervezésben. A Rust modulrendszerének köszönhetően könnyedén rendszerezheti Rust kódját, miközben megvalósítja az OOP-koncepciókat az alkalmazásban, hogy a kód rendszerezett, kezelhető és intuitív maradjon.