Reduceți amprenta codului Rust și creșteți robustețea acestuia cu tipuri generice.

Există întotdeauna niveluri de incertitudine în timpul dezvoltării aplicațiilor, care pot duce la erori, mai ales dacă funcțiile dumneavoastră acceptă anumite tipuri de argumente. Pentru a reduce erorile din cauza incertitudinilor, puteți utiliza Generics. Genericurile oferă funcționalitate pentru crearea de clase, funcții și structuri de date pentru lucrul cu diferite tipuri.

Folosind generice, puteți crea și defini algoritmi și structuri de date care pot funcționa pe mai multe tipuri fără a scrie cod complex și implementări separate pentru fiecare tip. Genericurile îmbunătățesc reutilizarea și eficiența codului, menținând în același timp siguranța și performanța tipului.

Utilizarea tipurilor generice în Rust

Tipul generic al lui Rust poate interopera cu alte tipuri de date Rust. Veți defini tipuri generice cu paranteze unghiulare (<>), urmate de doi sau mai mulți parametri.

Iată un generic definiția structurii care ia doi parametri de tip generic:

instagram viewer
structPunct {
// T și U sunt parametrii de tip generic pe care îi vor folosi câmpurile x și y
// presupune la instanțiere
x: T,
y: U,
}

În Punct structura, T, și U sunt parametrii de tip generic.

Puteți înlocui parametrii de tip generic cu orice tip de date la instanțiere:

fnprincipal() {
lăsa punctul_meu = Punctul { x: Şir::din("Buna ziua"), y: Şir::din("lume") };

println!(
„Valoarea x a punctului_meu este {}, iar valoarea y este {}.”,
punctul_meu.x,
punctul_meu.y
);
}

The punctul meu variabila este o instanță a Punct struct inițializat cu tipuri de șir. Compilatorul Rust deduce tipurile concrete de T și U pe baza valorilor de instanţiere.

Limite de trăsături pentru tipurile generice

Tipurile generice Rust pot folosi limite de trăsătură pentru a asigura siguranța tipului. Trăsăturile sunt colecții de metode pe care tipurile le pot implementa pentru a prezenta anumite comportamente definite pentru trăsătură.

Limitele de trăsătură specifică faptul că un tip generic trebuie să implementeze una sau mai multe trăsături.

Iată un exemplu de funcție generică care returnează cea mai mare dintre două valori cu o limită de trăsătură care asigură că tipurile comparate implementează trăsătura:

// Maximul este o trăsătură care definește o metodă de evaluare a maximului de două
// tipuri
trăsăturăMaxim {
fnmax(de sine, alte: De sine) -> De sine;
}

// Implementează trăsătura `Maximum` pentru toate tipurile care implementează
// Trăsătura `PartialOrd`.
implParțialOrd> Maximum pentru T {
fnmax(de sine, alte: De sine) -> De sine {
// returnează `self` dacă este mai mare decât `other`; în caz contrar, întoarce-te
// `altul.`
dacăde sine > altele {
de sine
} altfel {
alte
}
}
}

fnprincipal() {
lăsa a = 5;
lăsa b = 10;
lăsa cel mai mare = Maxim:: max (a, b);
println!(„Cea mai mare valoare este {}”, cel mai mare);
}

The Maxim trasatura are o max metodă care returnează cea mai mare dintre două valori de același tip. Orice tip care implementează ParțialOrd trăsătura implementează Maxim trăsătură.

The max metoda ia două valori ale De sine tip — referindu-se la tipul care implementează Maxim trăsătură — și compară valorile.

The principal funcția compară două variabile folosind funcția max metoda și tipărește cel mai mare.

Constrângeri pentru tipurile generice

Constrângerile sunt similare cu limitele de trăsătură, dar vă permit să specificați cerințe suplimentare pentru tipurile pe care le utilizați ca parametri de tip.

Dacă doriți să creați o funcție generică care acceptă tipuri pentru conversia șirurilor, puteți utiliza o constrângere pentru a vă asigura că parametrul tip implementează o trăsătură.

// ToString este o trăsătură cu o metodă de conversie a șirurilor
trăsăturăToString {
fnto_string(&de sine) -> Şir;
}

// to_string este o funcție generică care ia o valoare de orice tip care
// implementează caracteristica ToString
fnto_stringToString>(valoare: T) -> Şir {
value.to_string()
}

The to_string parametrul value trebuie să implementeze ToString caracteristică, care vă asigură că puteți converti valori de tip T a înşira cu to_string metodă.

Tipurile generice sunt utile pentru lucrul cu trăsăturile

Tipurile generice de rugina sunt puternice și există zone de îmbunătățire. Un domeniu critic de atenție este îmbunătățirea performanței codului generic. În prezent, sistemul de tip Rust poate impune o suprasarcină asupra codului generic, încetinind performanța.

Tipurile generice sunt benefice pentru lucrul cu trăsăturile. Folosind tipuri generice, puteți crea obiecte de trăsătură care funcționează cu orice tip care implementează o trăsătură pentru a face metodele mai flexibile.