En aquest tema, aprendrem com utilitzar structs en Rust per emmagatzemar dades relacionades i treballar amb elles de manera eficient. Els structs són una manera de crear tipus de dades personalitzats que agrupen diversos valors sota un mateix nom.

Contingut

Creació d'Instàncies de Structs

Per crear una instància d'un struct, primer hem de definir el struct. Aquí tenim un exemple d'un struct Rectangle:

struct Rectangle {
    width: u32,
    height: u32,
}

Ara podem crear una instància de Rectangle:

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("Rectangle: {} x {}", rect1.width, rect1.height);
}

Explicació

  • struct Rectangle { width: u32, height: u32 }: Defineix un struct anomenat Rectangle amb dos camps: width i height, ambdós de tipus u32.
  • let rect1 = Rectangle { width: 30, height: 50 }: Crea una instància de Rectangle amb width igual a 30 i height igual a 50.

Accés als Camps d'un Struct

Podem accedir als camps d'un struct utilitzant la notació de punt (.):

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("Width: {}", rect1.width);
    println!("Height: {}", rect1.height);
}

Explicació

  • rect1.width i rect1.height: Accedeix als valors dels camps width i height de la instància rect1.

Actualització de Valors en un Struct

Podem actualitzar els valors dels camps d'un struct si la instància és mutable:

fn main() {
    let mut rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    rect1.width = 40;
    println!("Updated width: {}", rect1.width);
}

Explicació

  • let mut rect1 = Rectangle { width: 30, height: 50 }: Crea una instància mutable de Rectangle.
  • rect1.width = 40: Actualitza el valor del camp width a 40.

Funcions Associades a Structs

Podem definir funcions associades a un struct utilitzant la paraula clau impl. Aquestes funcions poden ser mètodes que operen sobre instàncies del struct.

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("Area: {}", rect1.area());
}

Explicació

  • impl Rectangle { fn area(&self) -> u32 { self.width * self.height } }: Defineix una implementació per al struct Rectangle amb un mètode area que retorna l'àrea del rectangle.
  • rect1.area(): Crida al mètode area per a la instància rect1.

Exercicis Pràctics

Exercici 1: Crear i Utilitzar un Struct

  1. Defineix un struct anomenat Circle amb un camp radius de tipus f64.
  2. Crea una instància de Circle amb un radi de 10.0.
  3. Defineix un mètode circumference per al struct Circle que calculi la circumferència del cercle.
  4. Imprimeix la circumferència del cercle.

Solució

struct Circle {
    radius: f64,
}

impl Circle {
    fn circumference(&self) -> f64 {
        2.0 * std::f64::consts::PI * self.radius
    }
}

fn main() {
    let circle = Circle { radius: 10.0 };
    println!("Circumference: {}", circle.circumference());
}

Exercici 2: Actualitzar un Struct

  1. Defineix un struct anomenat Book amb els camps title, author i pages de tipus String, String i u32 respectivament.
  2. Crea una instància mutable de Book amb valors inicials.
  3. Actualitza el nombre de pàgines del llibre.
  4. Imprimeix els detalls del llibre actualitzat.

Solució

struct Book {
    title: String,
    author: String,
    pages: u32,
}

fn main() {
    let mut book = Book {
        title: String::from("The Rust Programming Language"),
        author: String::from("Steve Klabnik and Carol Nichols"),
        pages: 500,
    };

    book.pages = 550;
    println!("Title: {}, Author: {}, Pages: {}", book.title, book.author, book.pages);
}

Conclusió

En aquesta secció, hem après com crear i utilitzar structs en Rust. Hem vist com definir structs, crear instàncies, accedir i actualitzar els seus camps, i definir funcions associades. Els exercicis pràctics ens han ajudat a consolidar aquests conceptes. En el proper tema, explorarem els enums i la coincidència de patrons, que ens permetran treballar amb dades més complexes de manera eficient.

© Copyright 2024. Tots els drets reservats