Els genèrics són una característica poderosa de Rust que permeten escriure codi més flexible i reutilitzable. Amb els genèrics, pots definir funcions, structs, enums i mètodes que poden operar amb diferents tipus de dades sense sacrificar la seguretat de tipus.
Continguts
- Introducció als Genèrics
- Genèrics en Funcions
- Genèrics en Structs
- Genèrics en Enums
- Genèrics en Mètodes
- Exercicis Pràctics
- Introducció als Genèrics
Els genèrics permeten definir tipus o funcions que poden treballar amb qualsevol tipus de dades. Això es fa utilitzant paràmetres de tipus, que són variables de tipus que es defineixen entre els símbols < i >.
Exemple Bàsic
fn main() {
let number_list = vec![34, 50, 25, 100, 65];
let result = largest(&number_list);
println!("El nombre més gran és {}", result);
}
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}En aquest exemple, T és un paràmetre de tipus genèric. La funció largest pot treballar amb qualsevol tipus que implementi el trait PartialOrd.
- Genèrics en Funcions
Els genèrics en funcions permeten que les funcions treballin amb diferents tipus de dades sense duplicar el codi.
Exemple
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}En aquest exemple, T és un paràmetre de tipus genèric que ha de satisfer el trait PartialOrd per permetre la comparació.
- Genèrics en Structs
Els structs també poden utilitzar genèrics per emmagatzemar diferents tipus de dades.
Exemple
struct Point<T> {
x: T,
y: T,
}
fn main() {
let integer_point = Point { x: 5, y: 10 };
let float_point = Point { x: 1.0, y: 4.0 };
}En aquest exemple, Point<T> és un struct genèric que pot emmagatzemar qualsevol tipus de dades.
- Genèrics en Enums
Els enums poden utilitzar genèrics per representar diferents tipus de dades.
Exemple
enum Option<T> {
Some(T),
None,
}
fn main() {
let some_number = Option::Some(5);
let some_string = Option::Some("Hello");
}En aquest exemple, Option<T> és un enum genèric que pot emmagatzemar qualsevol tipus de dades.
- Genèrics en Mètodes
Els mètodes també poden utilitzar genèrics per treballar amb diferents tipus de dades.
Exemple
struct Point<T> {
x: T,
y: T,
}
impl<T> Point<T> {
fn x(&self) -> &T {
&self.x
}
}
fn main() {
let p = Point { x: 5, y: 10 };
println!("p.x = {}", p.x());
}En aquest exemple, el mètode x retorna una referència al camp x del struct Point<T>.
- Exercicis Pràctics
Exercici 1: Funció Genèrica
Escriu una funció genèrica smallest que trobi el valor més petit en una llista de qualsevol tipus que implementi el trait PartialOrd.
Solució
fn smallest<T: PartialOrd>(list: &[T]) -> &T {
let mut smallest = &list[0];
for item in list {
if item < smallest {
smallest = item;
}
}
smallest
}
fn main() {
let number_list = vec![34, 50, 25, 100, 65];
let result = smallest(&number_list);
println!("El nombre més petit és {}", result);
}Exercici 2: Struct Genèric
Defineix un struct genèric Rectangle que emmagatzemi l'amplada i l'alçada de qualsevol tipus de dades.
struct Rectangle<T> {
width: T,
height: T,
}
fn main() {
// Crea una instància de Rectangle amb tipus enter
// Crea una instància de Rectangle amb tipus float
}Solució
struct Rectangle<T> {
width: T,
height: T,
}
fn main() {
let int_rectangle = Rectangle { width: 30, height: 50 };
let float_rectangle = Rectangle { width: 30.5, height: 50.5 };
}Conclusió
Els genèrics són una eina poderosa en Rust que permeten escriure codi més flexible i reutilitzable. Hem vist com utilitzar genèrics en funcions, structs, enums i mètodes. Amb aquests coneixements, pots començar a escriure codi més genèric i adaptable a diferents tipus de dades.
