Zmanjšajte odtis kode Rust in povečajte njeno robustnost z generičnimi tipi.

Med razvijanjem aplikacij vedno obstajajo ravni negotovosti, ki lahko vodijo do napak, zlasti če vaše funkcije sprejemajo posebne vrste argumentov. Za zmanjšanje napak zaradi negotovosti lahko uporabite Generics. Generiki zagotavljajo funkcionalnost za ustvarjanje razredov, funkcij in podatkovnih struktur za delo z različnimi tipi.

Z uporabo generikov lahko ustvarite in definirate algoritme in podatkovne strukture, ki lahko delujejo na več vrstah, ne da bi pisali kompleksno kodo in ločene izvedbe za vsako vrsto. Generiki izboljšujejo ponovno uporabnost in učinkovitost kode, hkrati pa ohranjajo varnost tipov in zmogljivost.

Uporaba generičnih tipov v Rust

Rustov generični tip lahko interoperira z druge vrste podatkov Rust. Splošne tipe boste definirali z oglatimi oklepaji (<>), ki jim sledita dva ali več parametrov.

Tukaj je generično definicija strukture ki sprejme dva generična parametra tipa:

structTočka {
// T in U sta generična parametra tipa, ki ju bosta uporabljali polji x in y
instagram viewer

// prevzeti ob instanciranju
x: T,
y: U,
}

V Točka struktura, T, in U so parametri splošnega tipa.

Parametre splošnega tipa lahko zamenjate s poljubnim podatkovnim tipom pri instanciaciji:

fnglavni() {
pustiti moja_točka = Točka { x: Vrvica::od("zdravo"), y: Vrvica::od("svet") };

println!(
"Vrednost x za my_point je {} in vrednost y je {}.",
moja_točka.x,
moja_točka.y
);
}

The moja_točka spremenljivka je primerek Točka struct inicializiran z vrstami nizov. Prevajalnik Rust sklepa o konkretnih vrstah T in U na podlagi vrednosti na instanciaciji.

Meje lastnosti za generične tipe

Generični tipi Rust lahko uporabljajo meje lastnosti, da zagotovijo varnost tipa. Lastnosti so zbirke metod, ki jih tipi lahko izvajajo za prikaz določenih vedenj, definiranih za lastnost.

Meje lastnosti določajo, da mora generični tip izvajati eno ali več lastnosti.

Tukaj je primer generične funkcije, ki vrne večjo od dveh vrednosti z vezavo lastnosti, ki zagotavlja, da primerjani tipi izvajajo lastnost:

// Največ je lastnost, ki definira metodo za ocenjevanje največ dveh
// vrste
lastnostNajveč {
fnmaks(sebe, drugo: sebe) -> sebe;
}

// Implementira lastnost `Maximum` za vse vrste, ki implementirajo
// Lastnost `PartialOrd`.
implPartialOrd> Največ za T {
fnmaks(sebe, drugo: sebe) -> sebe {
// vrni `self`, če je večji od `other`; sicer vrni
// `drugo.`
česebe > drugo {
sebe
} drugače {
drugo
}
}
}

fnglavni() {
pustiti a = 5;
pustiti b = 10;
pustiti največji = največ:: max (a, b);
println!("Največja vrednost je {}", največji);
}

The Največ lastnost ima a maks metoda, ki vrne večjo od dveh vrednosti istega tipa. Vsaka vrsta, ki izvaja PartialOrd lastnost izvaja Največ lastnost.

The maks metoda ima dve vrednosti sebe tip—nanaša se na tip, ki izvaja Največ lastnost—in primerja vrednosti.

The glavni funkcija primerja dve spremenljivki z uporabo maks metodo in natisne največjo.

Omejitve za generične tipe

Omejitve so podobne mejam lastnosti, vendar vam omogočajo, da določite dodatne zahteve za tipe, ki jih uporabljate kot parametre tipa.

Če želite ustvariti generično funkcijo, ki sprejema tipe za pretvorbo nizov, lahko uporabite omejitev, da zagotovite, da parameter tipa izvaja lastnost.

// ToString je lastnost z metodo pretvorbe niza
lastnostToString {
fnna_niz(&sebe) -> Vrvica;
}

// to_string je generična funkcija, ki sprejme vrednost katere koli vrste, ki
// implementira lastnost ToString
fnna_nizToString>(vrednost: T) -> Vrvica {
value.to_string()
}

The na_niz parameter vrednosti mora izvajati ToString trait, ki zagotavlja, da lahko pretvorite vrednosti tipa T nizati z na_niz metoda.

Generični tipi so uporabni za delo z lastnostmi

Generične vrste Rust so močne in obstajajo področja za izboljšave. Kritično področje osredotočanja je izboljšanje učinkovitosti generične kode. Trenutno lahko Rustov tipski sistem povzroči dodatne stroške generični kodi, kar upočasni delovanje.

Generični tipi so koristni za delo z lastnostmi. Z uporabo generičnih tipov lahko ustvarite objekte lastnosti, ki delujejo s katerim koli tipom, ki implementira lastnost, da naredite svoje metode bolj prilagodljive.