Zmniejsz swój ślad w kodzie Rust i zwiększ jego niezawodność dzięki typom ogólnym.

Podczas tworzenia aplikacji zawsze występuje poziom niepewności, który może prowadzić do błędów, zwłaszcza jeśli funkcje akceptują określone typy argumentów. Aby zredukować błędy wynikające z niepewności, można użyć Generics. Typy generyczne zapewniają funkcjonalność tworzenia klas, funkcji i struktur danych do pracy z różnymi typami.

Używając generycznych, możesz tworzyć i definiować algorytmy i struktury danych, które mogą działać na wielu typach bez pisania złożonego kodu i oddzielnych implementacji dla każdego typu. Generyki poprawiają możliwość ponownego wykorzystania kodu i wydajność, zachowując jednocześnie bezpieczeństwo typów i wydajność.

Używanie typów ogólnych w Rust

Ogólny typ Rusta może współpracować z inne typy danych Rusta. Typy ogólne zdefiniujesz za pomocą nawiasów ostrych (<>), po których następują dwa lub więcej parametrów.

Oto rodzajowy definicja struktury który przyjmuje dwa ogólne parametry typu:

instagram viewer
strukturaPunkt {
// T i U to parametry typu ogólnego, które będą miały pola x i y
// załóż przy tworzeniu instancji
x: T,
y: ty,
}

w Punkt struktura, T, I u są parametrami typu ogólnego.

Parametry typu ogólnego można zastąpić dowolnym typem danych podczas tworzenia instancji:

przypgłówny() {
pozwalać mój_punkt = Punkt { x: Strunowy::z("Witam"), y: Strunowy::z("świat") };

drukuj!(
„Wartość x my_point to {}, a wartość y to {}”.,
mój_punkt.x,
mój_punkt.y
);
}

The mój punkt zmienna jest instancją Punkt struct zainicjowana typami łańcuchowymi. Kompilator Rusta wnioskuje o konkretnych typach T I u na podstawie wartości instancji.

Granice cech dla typów generycznych

Ogólne typy Rusta mogą wykorzystywać granice cech, aby zapewnić bezpieczeństwo typu. Cechy to zbiory metod, które typy mogą zaimplementować w celu wykazania określonych zachowań zdefiniowanych dla cechy.

Granice cech określają, że typ ogólny musi implementować jedną lub więcej cech.

Oto przykład funkcji ogólnej, która zwraca większą z dwóch wartości z ograniczeniem cechy, które gwarantuje, że porównywane typy implementują tę cechę:

// Maksimum to cecha określająca metodę oceny maksimum dwóch
// typy
cechaMaksymalny {
przypmaks(samego siebie, Inny: Samego siebie) -> Samego siebie;
}

// Implementuje cechę `Maximum` dla wszystkich typów, które implementują
// Cecha `PartialOrd`.
implikCzęściowy porządek> Maksymalny Do T {
przypmaks(samego siebie, Inny: Samego siebie) -> Samego siebie {
// zwróć `self` jeśli jest większe niż `other`; w przeciwnym razie wróć
// `inne.`
Jeślisamego siebie > inne {
samego siebie
} w przeciwnym razie {
Inny
}
}
}

przypgłówny() {
pozwalać = 5;
pozwalać b = 10;
pozwalać największy = Maksimum:: max (a, b);
drukuj!(„Największa wartość to {}”, Największa);
}

The Maksymalny cecha ma maks Metoda, która zwraca większą z dwóch wartości tego samego typu. Dowolny typ, który implementuje Częściowy porządek cecha realizuje Maksymalny cecha.

The maks Metoda przyjmuje dwie wartości Samego siebie typ—odnoszący się do typu implementującego Maksymalny cecha — i porównuje wartości.

The główny funkcja porównuje dwie zmienne za pomocą maks metoda i drukuje największy.

Ograniczenia dla typów ogólnych

Ograniczenia są podobne do granic cech, ale pozwalają określić dodatkowe wymagania dotyczące typów, których używasz jako parametrów typu.

Jeśli chcesz utworzyć funkcję ogólną, która akceptuje typy do konwersji łańcuchów, możesz użyć ograniczenia, aby upewnić się, że parametr typu implementuje cechę.

// ToString to cecha z metodą konwersji ciągów znaków
cechaToString {
przypdo_ciągu(&samego siebie) -> Strunowy;
}

// to_string jest funkcją ogólną, która przyjmuje wartość dowolnego typu
// implementuje cechę ToString
przypdo_ciąguToString>(wartość: T) -> Strunowy {
value.to_string()
}

The do_ciągu parametr value musi implementować ToString cecha, która gwarantuje, że możesz konwertować wartości typu T sznurować z do_ciągu metoda.

Typy ogólne są przydatne do pracy z cechami

Ogólne typy rdzy są potężne i istnieją obszary wymagające ulepszeń. Krytycznym obszarem zainteresowania jest poprawa wydajności kodu ogólnego. Obecnie system typów w Rust może narzucać ogólny kod, spowalniając wydajność.

Typy ogólne są przydatne do pracy z cechami. Korzystając z typów ogólnych, możesz tworzyć obiekty cech, które działają z dowolnym typem implementującym cechę, aby Twoje metody były bardziej elastyczne.