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:
En aquest exemple, Message
té quatre variants:
Quit
: No té dades associades.Move
: Té un camp anònim amb dues coordenadesx
iy
.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
- Defineix un enum anomenat
Status
amb les variantsActive
,Inactive
iPending
. - 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
- Defineix un enum anomenat
Result
amb les variantsSuccess
iError
. - Crea una funció que prengui un
Result
com a paràmetre i utilitziif let
per imprimir un missatge si ésSuccess
.
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.