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

  1. Introducció als Genèrics
  2. Genèrics en Funcions
  3. Genèrics en Structs
  4. Genèrics en Enums
  5. Genèrics en Mètodes
  6. Exercicis Pràctics

  1. 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.

  1. 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ó.

  1. 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.

  1. 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.

  1. 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>.

  1. 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.

fn smallest<T: PartialOrd>(list: &[T]) -> &T {
    // Implementa la funció aquí
}

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.

© Copyright 2024. Tots els drets reservats