Mutabilidad

Los datos mutables se pueden tomar prestados de forma mutable usando &mut T. Esto se denomina una referencia mutable y otorga acceso de lectura y escritura al prestatario. Por el contrario, &T toma prestados los datos a través de una referencia inmutable, y el prestatario puede leer los datos pero no modificarlos:

#[allow(dead_code)]
#[derive(Clone, Copy)]
struct Libro {
    // `&'static str` es una referencia a una cadena asignada en la memoria de solo
    // lectura
    autor: &'static str,
    titulo: &'static str,
    agno: u32,
}

// Esta función toma una referencia a un libro
fn pedir_prestado_libro(book: &Libro) {
    println!("Pedí prestado inmutablemente {} - edición {}", book.titulo, book.agno);
}

// Esta función toma una referencia a un libro mutable y cambia `agno` a 2014
fn nueva_edicion(book: &mut Libro) {
    book.agno = 2014;
    println!("Pedí prestado mutablemente {} - edición {}", book.titulo, book.agno);
}

fn main() {
    // Crea un Libro inmutable llamado `libro_inmutable`
    let libro_inmutable = Libro {
        // los literales de cadena tienen tipo `&'static str`
        autor: "Douglas Hofstadter",
        titulo: "Gödel, Escher, Bach",
        agno: 1979,
    };

    // Crea una copia mutable de `libro_inmutable` y llámala` libro_mutable`
    let mut libro_mutable = libro_inmutable;
    
    // Pide prestado de forma inmutable un objeto inmutable
    pedir_prestado_libro(&libro_inmutable);

    // Pide presta de forma inmutable un objeto mutable
    pedir_prestado_libro(&libro_mutable);
    
    // Pide prestado un objeto mutable como mutable
    nueva_edicion(&mut libro_mutable);
    
    // ¡Error! No se puede tomar prestado un objeto inmutable como mutable
    nueva_edicion(&mut libro_inmutable);
    // FIXME ^ Comenta esta línea
}

Ve también

static