En aquest tema, explorarem els enums (tipus enumerats) i la coincidència de patrons en Rust. Els enums són una manera poderosa de definir tipus que poden tenir diferents variants, i la coincidència de patrons és una tècnica per treballar amb aquests tipus de manera segura i expressiva.

Enums

Definició d'Enums

Els enums permeten definir un tipus que pot tenir diversos valors diferents. Cada valor es diu variant. Aquí teniu un exemple d'un enum que representa diferents tipus de missatges:

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

En aquest exemple, Message té quatre variants:

  • Quit: No té dades associades.
  • Move: Té un camp anònim amb dues coordenades x i y.
  • Write: Té un camp amb una cadena de text.
  • ChangeColor: Té tres camps amb valors enters.

Ús d'Enums

Per utilitzar un enum, primer hem de crear una instància d'una de les seves variants. Aquí teniu alguns exemples:

fn main() {
    let quit = Message::Quit;
    let move_message = Message::Move { x: 10, y: 20 };
    let write_message = Message::Write(String::from("Hola, món!"));
    let change_color = Message::ChangeColor(255, 0, 0);
}

Coincidència de Patrons

Introducció a la Coincidència de Patrons

La coincidència de patrons és una característica poderosa que permet descompondre tipus complexos i prendre decisions basades en la seva estructura. La coincidència de patrons es fa servir sovint amb enums per manejar les diferents variants.

match Expressions

L'expressió match és una manera comuna de fer coincidència de patrons en Rust. Aquí teniu un exemple que mostra com utilitzar match amb l'enum Message:

fn process_message(msg: Message) {
    match msg {
        Message::Quit => {
            println!("Quit variant");
        }
        Message::Move { x, y } => {
            println!("Move to x: {}, y: {}", x, y);
        }
        Message::Write(text) => {
            println!("Text message: {}", text);
        }
        Message::ChangeColor(r, g, b) => {
            println!("Change color to red: {}, green: {}, blue: {}", r, g, b);
        }
    }
}

fn main() {
    let msg = Message::Move { x: 10, y: 20 };
    process_message(msg);
}

Coincidència de Patrons amb if let

L'expressió if let és una manera més concisa de fer coincidència de patrons quan només ens interessa una variant específica. Aquí teniu un exemple:

fn main() {
    let msg = Message::Write(String::from("Hola, món!"));

    if let Message::Write(text) = msg {
        println!("Text message: {}", text);
    } else {
        println!("No és un missatge de text");
    }
}

Exercicis Pràctics

Exercici 1: Definir i Utilitzar un Enum

  1. Defineix un enum anomenat Status amb les variants Active, Inactive i Pending.
  2. Crea una funció que prengui un Status com a paràmetre i imprimeixi un missatge diferent per a cada variant.

Solució

enum Status {
    Active,
    Inactive,
    Pending,
}

fn print_status(status: Status) {
    match status {
        Status::Active => println!("Status is active"),
        Status::Inactive => println!("Status is inactive"),
        Status::Pending => println!("Status is pending"),
    }
}

fn main() {
    let status = Status::Active;
    print_status(status);
}

Exercici 2: Coincidència de Patrons amb if let

  1. Defineix un enum anomenat Result amb les variants Success i Error.
  2. Crea una funció que prengui un Result com a paràmetre i utilitzi if let per imprimir un missatge si és Success.

Solució

enum Result {
    Success,
    Error,
}

fn check_result(result: Result) {
    if let Result::Success = result {
        println!("Operation was successful");
    } else {
        println!("Operation failed");
    }
}

fn main() {
    let result = Result::Success;
    check_result(result);
}

Resum

En aquesta secció, hem après sobre els enums i la coincidència de patrons en Rust. Els enums ens permeten definir tipus amb diverses variants, i la coincidència de patrons ens permet treballar amb aquests tipus de manera segura i expressiva. Hem vist com utilitzar l'expressió match i if let per fer coincidència de patrons i hem practicat amb alguns exercicis. En el proper mòdul, explorarem les col·leccions en Rust.

© Copyright 2024. Tots els drets reservats