Učenje o ova dva koncepta pomoći će vam da bolje razumijete kako Rust funkcionira i kako možete implementirati OOP značajke.

Osobine i životni vijek ključne su komponente Rusta. Svojstva možete koristiti za definiranje ponašanja i sposobnosti za implementaciju tipova. Vrlo su svestrani, omogućujući vam da napišete više generičkog koda, smanjite dupliciranje i poboljšate mogućnost održavanja.

Rust koristi još jedan mehanizam - životni vijek - za praćenje vlasništva nad varijablama unutar i izvan opsega. Ovo sprječava viseće pokazivače tijekom oslobađanja varijable.

Zajedno, značajke i životni vijek pomažu u osiguravanju sigurnosti tipa, sigurnosti memorije i pouzdanosti koda.

Razumijevanje osobina u Rustu

Značajke su zbirke metoda koje druge vrste mogu implementirati. Osobine su slične sučelja u jezicima poput Jave, Go i TypeScript, ali fleksibilniji.

Vi ćete koristiti osobina ključna riječ za definiranje značajki u Rustu, nakon čega slijedi deklaracija potpisa metode.

osobinaMoja osobina {
fnmoja_metoda(&sebe);
}

Kod definira svojstvo pod nazivom Moja osobina s moja_metoda metoda. The &sebe parametar označava da se metoda odnosi na objekt implementirajućeg tipa kao svoj prvi parametar.

Nakon što definirate značajku, možete je implementirati za svoje prilagođene tipove.

Evo kako možete implementirati značajku za svoje tipove struktura.

strukturiratiOsoba {
Ime: Niz,
dob: u32,
}

impl Info za osoba {
fnSažetak(&sebe) {
println!("Zovem se {} i imam {} godina.", sebe.Ime, sebe.dob);
}
}

The Osoba struct implementira Info, a možete nazvati Sažetak metoda na primjerima Osoba strukturirati

fnglavni(){
neka john = osoba { ime: Niz::iz("Ivan"), dob: 30 };
john.sažetak(); // Izlaz: Zovem se John i imam 30 godina.
}

The Ivan varijabla je instanca Osoba strukturirati

The glavni pozivi funkcija Sažetak koji ispisuje poruku na konzolu:

Enumi mogu implementirati osobine. Evo kako možete definirati enum s varijantama koje implementiraju Sažetak metoda:

nabrajanjeMyEnum {
VarijantaA,
VarijantaB,
}

impl Info za MyEnum {
fnSažetak(&sebe) {
odgovaratisebe {
MyEnum:: VariantA => {
// implementacija za VariantA
}
MyEnum:: VariantB => {
// implementacija za VariantB
}
}
}
}

Korištenje značajki za parametre funkcije i povratne vrijednosti

Značajke možete koristiti kao parametre funkcije i povratne vrijednosti. Korištenje značajki kao parametara funkcije zgodno je za pisanje generičkog koda s više vrsta.

Ovdje je funkcija koja uzima parametar bilo koje vrste koja se implementira Info.

fnučini nešto(vrijednost: T) {
vrijednost.sažetak();
}

The sintaksa to specificira T mora implementirati Info. Možete nazvati Sažetak funkcija s bilo kojom vrijednošću koja implementira Info.

Životni vijek u Rustu

Rustov alat za provjeru posudbe analizira programe i osigurava pravilno korištenje memorije. u Rustu, svaka vrijednost ima svog vlasnika koji je odgovoran za raspodjelu vrijednosti. Kada varijable posuđuju vrijednosti, posuđuju referencu na prenesenu vrijednost, ali vlasnik zadržava vlasništvo.

Životni vijek je način da se osigura da se posuđene vrijednosti ispravno koriste. Životni vijek je oznaka pričvršćena na referencu koja opisuje koliko dugo referenca vrijedi.

U Rustu možete navesti životni vijek korištenjem apostrofa:

func<'a>

Prilikom stvaranja reference, referenci se dodjeljuje životni vijek koji opisuje koliko dugo vrijedi. Ako imate funkciju koja uzima referencu na vrijednost, životni vijek mora biti duži od poziva funkcije kako bi se osiguralo da je vrijednost važeća kada se funkcija vrati.

Evo primjera specifikacije životnog vijeka u funkciji.

fnučini nešto<'a>(x: &'ai32) -> &'ai32 {
x
}

fnglavni() {
neka x = 42;
neka rezultat = učini_nešto(&x);
println!("Rezultat je: {}", rezultat);
}

u učini nešto funkcija, 'a parametar životnog vijeka označava da je referenca na x vrijedi sve dok traje poziv funkcije. Vraćena referenca također je važeća sve dok traje poziv funkcije.

The glavni funkcija ispisuje rezultat prosljeđivanjem reference na x varijabla u glavni funkciju na konzolu.

Sintaksa trajanja može biti opširna, ali je bitna za sigurnost i upravljanje memorijom. Pravila elizije s tri životna vijeka pružaju smjernice koje omogućuju Rustu da zaključi o životnom vijeku referenci u određenim situacijama.

Pravilo trajanja unosa

Pravilo životnog vijeka unosa navodi da ako funkcija ili metoda uzima jednu ili više referenci kao ulazne parametre, Rust pretpostavlja da sve reference imaju isti životni vijek.

Jednostavno rečeno, životni vijek izlaznih referenci bit će isti kao i životni vijek ulaznih referenci.

fnnajduži<'a>(x: &'astr, y: &'astr) -> &'astr {
ako x.len() > y.len() { x } drugo {y}
}

u najduži funkcija, Rust zaključuje da je životni vijek izlazne reference isti kao ulazne reference jer obje imaju isti parametar životnog vijeka 'a.

Pravilo trajanja unosa olakšava pisanje generičkih funkcija koje uzimaju višestruke reference kao unos.

Pravilo trajanja izlaza

Pravilo izlaznog životnog vijeka specificira da ako funkcija ili metoda vrati referencu, Rust će pretpostaviti da se životni vijek izlazne reference razlikuje od životnog vijeka bilo koje ulazne reference.

fnprva_riječ<'a>(s: &'astr) -> &'astr {
s.split_whitespace().next().unwrap()
}

U ovoj funkciji, Rust zaključuje da se životni vijek izlazne reference razlikuje od životnog vijeka ulazne reference jer split_whitespace() metoda stvara izlaznu referencu koja ne uzima ulazne referentne parametre.

Pravilo elizije trajanja života

Pravilo elizije vijeka trajanja primjenjuje se ako funkcija ili metoda uzme jednu referencu ili ulazni parametar i vrati referencu. U tom slučaju, Rust pretpostavlja da izlazna referenca ima isti vijek trajanja kao ulazna referenca.

fnnajduži<'a>(x: &'astr, y: &str) -> &'astr {
ako x.len() > y.len() { x } drugo {y}
}

U ovoj funkciji Rust zaključuje da je životni vijek izlazne reference isti kao životni vijek ulazne reference jer ulazna referenca g nema parametar trajanja. Rđa poništava parametar vijeka trajanja g i pretpostavlja da ima isti životni vijek kao x.

Ovo pravilo olakšava pisanje funkcija koje uzimaju jednu ulaznu referencu i vraćaju jednu izlaznu referencu.

Osobine i životni vijek

Možete kombinirati značajke i životni vijek kako biste stvorili generičke funkcije koje rade za tipove koji implementiraju svojstvo i imaju valjani životni vijek.

Ovdje je značajka i funkcija koja upućuje na vrijednost koja implementira značajku.

osobinaToString {
fnna_string(&sebe) -> Niz;
}

fnna_string<'a, T: ToString>(t: &'a T) -> Niz {
t.to_string()
}

Ovdje, parametar životnog vijeka 'a osigurava da referenca t vrijedi za vrijeme trajanja objekta na koji se poziva. Možete koristiti na_string funkcija s tipovima koji implementiraju ToString osobina koja ima valjani životni vijek.

Svojstva čine osnovu za implementaciju OOP koncepata u Rustu

Osobine vam omogućuju definiranje ponašanja. Iako Rust nije objektno orijentirani programski jezik (OOP), možete koristiti značajke za implementaciju OOP koncepata od enkapsulacije do nasljeđivanja, polimorfizma i apstrakcije.

Implementacija ovih OOP koncepata sa značajkama čini vaše Rust programe skalabilnim, robusnim, održivim i učinkovitim.