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.