Snižte svou stopu v kódu Rust a zvyšte jeho robustnost pomocí obecných typů.

Při vývoji aplikací vždy existují určité úrovně nejistoty, což může vést k chybám, zejména pokud vaše funkce přijímají specifické typy argumentů. Chcete-li omezit chyby způsobené nejistotami, můžete použít Generics. Generika poskytují funkce pro vytváření tříd, funkcí a datových struktur pro práci s různými typy.

Pomocí generik můžete vytvářet a definovat algoritmy a datové struktury, které mohou fungovat na více typech bez psaní složitého kódu a samostatných implementací pro každý typ. Generika zlepšují znovupoužitelnost a efektivitu kódu při zachování typové bezpečnosti a výkonu.

Použití obecných typů v Rust

Rustův generický typ může spolupracovat s jiné datové typy Rust. Obecné typy definujete pomocí lomených závorek (<>), za kterými následují dva nebo více parametrů.

Zde je obecný definice struktury který přebírá dva parametry obecného typu:

strukturovatSměřovat {
// T a U jsou parametry obecného typu, které budou mít pole x a y
// předpokládáme konkretizaci
x: T,
y: U,
}
instagram viewer

V Směřovat struktura, T, a U jsou parametry obecného typu.

Parametry obecného typu můžete při vytváření instance nahradit libovolným datovým typem:

fnhlavní() {
nechat můj_bod = Bod { x: Tětiva::z("Ahoj"), y: Tětiva::z("svět") };

println!(
"Hodnota x mého_bodu je {} a hodnota y je {}.",
muj_bod.x,
můj_bod.y
);
}

The můj názor proměnná je instancí třídy Směřovat struct inicializovaná s typy řetězců. Kompilátor Rust odvodí konkrétní typy T a U na základě hodnot při instanciaci.

Hranice vlastností pro obecné typy

Generické typy Rust mohou používat hranice vlastností k zajištění bezpečnosti typu. Vlastnosti jsou kolekce metod, které typy mohou implementovat, aby vykazovaly určité chování definované pro vlastnost.

Hranice vlastností určují, že obecný typ musí implementovat jednu nebo více vlastností.

Zde je příklad obecné funkce, která vrací větší ze dvou hodnot s vazbou vlastnosti, která zajišťuje, že porovnávané typy vlastnost implementují:

// Maximum je vlastnost, která definuje metodu pro vyhodnocení maxima dvou
// typy
vlastnostMaximum {
fnmax(, jiný: ) -> ;
}

// Implementuje vlastnost `Maximum` pro všechny typy, které implementují
// Vlastnost `PartialOrd`.
implČástečný Obj> Maximum pro T {
fnmax(, jiný: ) -> {
// vrátí `vlastní`, pokud je větší než `jiné`; jinak vrátit
// `jiné.`
-li > jiné {

} jiný {
jiný
}
}
}

fnhlavní() {
nechat a = 5;
nechat b = 10;
nechat největší = Maximum:: max (a, b);
println!("Největší hodnota je {}", největší);
}

The Maximum vlastnost má a max metoda, která vrací větší ze dvou hodnot stejného typu. Jakýkoli typ, který implementuje Částečný Obj vlastnost implementuje Maximum vlastnost.

The max metoda nabývá dvou hodnot typ – s odkazem na typ implementující Maximum vlastnost — a porovnává hodnoty.

The hlavní funkce porovnává dvě proměnné pomocí max metoda a tiskne největší.

Omezení pro obecné typy

Omezení jsou podobná hranicím vlastností, ale umožňují zadat další požadavky na typy, které používáte jako parametry typu.

Pokud chcete vytvořit generickou funkci, která přijímá typy pro převod řetězců, můžete použít omezení, abyste zajistili, že parametr typu implementuje vlastnost.

// ToString je vlastnost s metodou konverze řetězce
vlastnostToString {
fndo_řetězce(&) -> Tětiva;
}

// to_string je obecná funkce, která přebírá hodnotu libovolného typu
// implementuje vlastnost ToString
fndo_řetězceToString>(hodnota: T) -> Tětiva {
value.to_string()
}

The do_řetězce hodnota parametru musí implementovat ToString vlastnost, která zajišťuje, že můžete převádět hodnoty typu T provázat s do_řetězce metoda.

Obecné typy jsou užitečné pro práci s vlastnostmi

Generické typy Rust jsou výkonné a existují oblasti pro zlepšení. Kritickou oblastí zájmu je zlepšení výkonu generického kódu. V současné době může systém typu Rust uvalit režii na generický kód a zpomalit výkon.

Generické typy jsou prospěšné pro práci s vlastnostmi. Pomocí generických typů můžete vytvářet objekty vlastností, které fungují s jakýmkoli typem implementujícím vlastnost, aby byly vaše metody flexibilnější.