Spoznavanje teh dveh konceptov bo pomagalo okrepiti vaše razumevanje delovanja Rust in kako lahko implementirate funkcije OOP.

Lastnosti in življenjska doba so ključne sestavine Rusta. Lastnosti lahko uporabite za definiranje vedenja in zmožnosti za implementacijo tipov. So zelo vsestranski, saj vam omogočajo pisanje bolj splošne kode, zmanjšanje podvajanja in izboljšanje vzdrževanja.

Rust uporablja drug mehanizem – življenjske dobe – za sledenje lastništvu spremenljivk v obsegu in zunaj njega. To preprečuje viseče kazalce med sprostitvijo spremenljivke.

Lastnosti in življenjske dobe skupaj pomagajo zagotoviti varnost tipa, varnost pomnilnika in zanesljivost kode.

Razumevanje lastnosti v Rustu

Lastnosti so zbirke metod, ki jih lahko izvajajo druge vrste. Lastnosti so podobne vmesniki v jezikih, kot je Java, Go in TypeScript, vendar bolj prilagodljiv.

Uporabili boste lastnost ključno besedo za definiranje lastnosti v Rustu, ki ji sledi deklaracija podpisov metode.

lastnostMyTrait {
fnmoja_metoda(&sebe);
}

Koda definira lastnost z imenom MyTrait z moja_metoda metoda. The &sebe parameter označuje, da se metoda nanaša na objekt izvedbenega tipa kot svoj prvi parameter.

Ko definirate lastnost, jo lahko implementirate za svoje vrste po meri.

Tukaj je opisano, kako lahko implementirate lastnost za svoje vrste struktur.

structOseba {
ime: Vrvica,
starost: u32,
}

impl Informacije za Oseba {
fnpovzetek(&sebe) {
println!("Ime mi je {} in star sem {} let.", sebe.ime, sebe.starost);
}
}

The Oseba struct izvaja Informacije, in lahko pokličete povzetek metoda na primerih Oseba struct.

fnglavni(){
pustiti john = oseba { ime: Vrvica::od("Janez"), starost: 30 };
john.summary(); // Izhod: Ime mi je John in star sem 30 let.
}

The Janez spremenljivka je primerek Oseba struct.

The glavni funkcijske klice povzetek ki natisne sporočilo na konzolo:

Enumi lahko izvajajo lastnosti. Tukaj je opisano, kako lahko definirate enum z različicami, ki izvajajo povzetek metoda:

enumMyEnum {
VariantaA,
VariantaB,
}

impl Informacije za MyEnum {
fnpovzetek(&sebe) {
tekmasebe {
MyEnum:: VariantA => {
// implementacija za VariantA
}
MyEnum:: VariantB => {
// implementacija za VariantB
}
}
}
}

Uporaba lastnosti za parametre funkcij in povratne vrednosti

Lastnosti lahko uporabite kot parametre funkcije in vrnjene vrednosti. Uporaba lastnosti kot funkcijskih parametrov je priročna za pisanje generične kode z več vrstami.

Tukaj je funkcija, ki sprejme parameter katere koli vrste, ki se izvaja Informacije.

fnnaredi kaj(vrednost: T) {
vrednost.povzetek();
}

The sintaksa to določa T mora izvajati Informacije. Lahko pokličete povzetek funkcijo s katero koli vrednostjo, ki izvaja Informacije.

Življenjske dobe v Rustu

Rustovo orodje za preverjanje izposoje analizira programe in zagotavlja pravilno uporabo pomnilnika. V Rustu, vsaka vrednost ima lastnika ki je odgovoren za razporeditev vrednosti. Kdaj spremenljivke si izposojajo vrednosti, si izposodijo sklic na posredovano vrednost, vendar lastnik obdrži lastništvo.

Življenjske dobe so način za zagotovitev pravilne uporabe izposojenih vrednosti. Življenjska doba je oznaka, pritrjena na referenco, ki opisuje, kako dolgo je referenca veljavna.

V Rustu lahko določite življenjsko dobo z opombo z apostrofom:

func<'a>

Ob ustvarjanju sklica se sklicu dodeli življenjska doba, ki opisuje, kako dolgo je veljaven. Če imate funkcijo, ki sprejme sklic na vrednost, mora biti življenjska doba daljša od klica funkcije, da zagotovite, da je vrednost veljavna, ko se funkcija vrne.

Tukaj je primer specifikacije življenjske dobe v funkciji.

fnnaredi kaj<'a>(x: &'ai32) -> &'ai32 {
x
}

fnglavni() {
pustiti x = 42;
pustiti rezultat = narediti_nekaj(&x);
println!("Rezultat je: {}", rezultat);
}

V naredi kaj funkcija, 'a parameter življenjska doba označuje, da je sklicevanje na x velja, dokler je klic funkcije. Vrnjena referenca je prav tako veljavna, dokler je klic funkcije.

The glavni funkcija natisne rezultat tako, da posreduje sklic na x spremenljivka v glavni funkcijo na konzolo.

Sintaksa življenjske dobe je lahko podrobna, vendar je bistvena za varnost in upravljanje pomnilnika. Pravila izločitve s tremi življenjskimi dobami zagotavljajo smernice, ki Rustu omogočajo sklepanje o življenjski dobi referenc v določenih situacijah.

Pravilo življenjske dobe vnosa

Pravilo življenjske dobe vnosa določa, da če funkcija ali metoda vzame enega ali več sklicev kot vhodne parametre, Rust predpostavlja, da imajo vsi sklice enako življenjsko dobo.

Preprosto povedano, življenjska doba izhodnih referenc bo enaka življenjski dobi vhodnih referenc.

fnnajdaljši<'a>(x: &'astr, y: &'astr) -> &'astr {
če x.len() > y.len() { x } drugače { y }
}

V najdaljši funkcijo, Rust sklepa, da je življenjska doba izhodne reference enaka kot vhodna referenca, ker imata oba enak parameter življenjske dobe 'a.

Pravilo življenjske dobe vnosa olajša pisanje generičnih funkcij, ki kot vnos sprejmejo več referenc.

Pravilo življenjske dobe izhoda

Pravilo o izhodni življenjski dobi določa, da če funkcija ali metoda vrne referenco, bo Rust domneval, da se življenjska doba izhodne reference razlikuje od življenjske dobe katere koli vhodne reference.

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

V tej funkciji Rust sklepa, da je življenjska doba izhodne reference drugačna od življenjske dobe vhodne reference, ker split_whitespace() metoda ustvari izhodno referenco, ki ne sprejme nobenih vhodnih referenčnih parametrov.

Pravilo izločitve življenj

Pravilo o izločitvi življenjskih dob velja, če funkcija ali metoda vzame en sklic ali vhodni parameter in vrne sklic. V tem primeru Rust predpostavlja, da ima izhodna referenca enako življenjsko dobo kot vhodna referenca.

fnnajdaljši<'a>(x: &'astr, y: &str) -> &'astr {
če x.len() > y.len() { x } drugače { y }
}

V tej funkciji Rust sklepa, da je življenjska doba izhodne reference enaka življenjski dobi vhodne reference, ker vhodna referenca l nima parametra življenjske dobe. Rja izniči parameter življenjske dobe za l in predpostavlja, da ima enako življenjsko dobo kot x.

To pravilo olajša pisanje funkcij, ki sprejmejo eno vhodno referenco in vrnejo eno izhodno referenco.

Lastnosti in življenjska doba

Lahko kombinirate lastnosti in življenjske dobe, da ustvarite generične funkcije, ki delujejo za tipe, ki implementirajo lastnost in imajo veljavno življenjsko dobo.

Tukaj sta lastnost in funkcija, ki se sklicuje na vrednost, ki izvaja lastnost.

lastnostToString {
fnna_niz(&sebe) -> Vrvica;
}

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

Tukaj je parameter življenjske dobe 'a zagotavlja, da referenca t velja za življenjsko dobo predmeta, na katerega se sklicuje. Lahko uporabite na_niz funkcijo s tipi, ki izvajajo ToString lastnost, ki ima veljavno življenjsko dobo.

Lastnosti tvorijo osnovo za implementacijo OOP konceptov v Rust

Lastnosti vam omogočajo, da definirate vedenje. Čeprav Rust ni objektno usmerjen programski jezik (OOP), lahko uporabite lastnosti za implementacijo konceptov OOP od enkapsulacije do dedovanja, polimorfizma in abstrakcije.

Implementacija teh OOP konceptov z lastnostmi naredi vaše programe Rust razširljive, robustne, vzdržljive in učinkovite.