En aquest tema, explorarem dos conceptes fonamentals en Rust: les referències i el préstec. Aquests conceptes són crucials per comprendre com Rust gestiona la memòria de manera segura i eficient.

Què són les Referències?

Les referències permeten accedir a una variable sense prendre'n la propietat. Això és útil quan volem llegir o modificar una variable sense transferir-ne la propietat.

Creació de Referències

Per crear una referència a una variable, utilitzem el símbol &. Aquí teniu un exemple:

fn main() {
    let x = 5;
    let y = &x; // y és una referència a x

    println!("El valor de x és: {}", x);
    println!("El valor de y és: {}", y);
}

Referències Immutables

Les referències per defecte són immutables, el que significa que no podem modificar la variable a través de la referència.

fn main() {
    let x = 5;
    let y = &x;

    // *y = 6; // Això donarà un error perquè y és una referència immutable
}

Referències Mutables

Si volem modificar la variable a través de la referència, hem de fer servir una referència mutable. Per crear una referència mutable, utilitzem &mut.

fn main() {
    let mut x = 5;
    let y = &mut x; // y és una referència mutable a x

    *y = 6; // Modifiquem el valor de x a través de y

    println!("El valor de x és: {}", x);
}

Préstec

El préstec és el mecanisme que Rust utilitza per gestionar les referències. Hi ha dues regles principals per al préstec:

  1. Només pot haver-hi una referència mutable a una variable en un moment donat.
  2. Poden haver-hi múltiples referències immutables a una variable, però no poden coexistir amb una referència mutable.

Exemple de Préstec

fn main() {
    let mut x = 5;
    let y = &x; // Referència immutable a x
    let z = &x; // Una altra referència immutable a x

    println!("El valor de y és: {}", y);
    println!("El valor de z és: {}", z);

    // let w = &mut x; // Això donarà un error perquè ja hi ha referències immutables a x
}

Exemple de Préstec Mutu

fn main() {
    let mut x = 5;
    {
        let y = &mut x; // Referència mutable a x
        *y += 1; // Modifiquem el valor de x a través de y
    } // y surt del seu àmbit aquí, així que podem crear una nova referència mutable

    let z = &mut x; // Una nova referència mutable a x
    *z += 1;

    println!("El valor de x és: {}", x);
}

Exercicis Pràctics

Exercici 1

Crea una funció que prengui una referència immutable a un enter i imprimeixi el seu valor.

fn imprimir_valor(x: &i32) {
    println!("El valor és: {}", x);
}

fn main() {
    let x = 10;
    imprimir_valor(&x);
}

Exercici 2

Crea una funció que prengui una referència mutable a un enter i incrementi el seu valor en 1.

fn incrementar(x: &mut i32) {
    *x += 1;
}

fn main() {
    let mut x = 10;
    incrementar(&mut x);
    println!("El valor incrementat és: {}", x);
}

Errors Comuns i Consells

  1. Referències Dangling: Assegura't que les referències no apunten a dades que ja no existeixen.
  2. Conflictes de Préstec: Recorda les regles de préstec per evitar errors de compilació.
  3. Àmbit de les Referències: Les referències han de viure dins del seu àmbit. Quan una referència surt del seu àmbit, ja no és vàlida.

Conclusió

Les referències i el préstec són conceptes fonamentals en Rust que permeten gestionar la memòria de manera segura i eficient. Comprendre com funcionen les referències immutables i mutables, així com les regles de préstec, és essencial per escriure codi Rust robust i lliure d'errors. En el proper tema, explorarem els slices, una altra eina poderosa per treballar amb dades en Rust.

© Copyright 2024. Tots els drets reservats