← Índice

1.9 En el taller, la lista

Esta traducción fue asistida por IA y revisada superficialmente. Si encuentras errores o algo no suena natural, escríbeme — lo agradezco.

El estante existe. Las tareas descansan en él en orden. Pero cada vez que hay que añadir algo o revisarlo, el artesano alcanza el estante directamente - a mano, sin herramienta. Mientras todo cabe en una sola mirada, eso es tolerable. Eso es lo que significa “por ahora”.

El intento

main actualmente pone tareas en la lista directamente, a través de push. Mientras hay tres tareas y añadirlas es la única operación, push no desentona. Es hora de darle un nombre: una función add que recibe una lista y una tarea y la pone dentro. La lista no necesita cederse - una referencia es suficiente:

fn add(tasks: &Vec<Task>, task: Task) {
    tasks.push(task);
}

El compilador responde:

error[E0596]: cannot borrow `*tasks` as mutable, as it is behind a `&` reference
 --> src/main.rs:XX:XX
  |
XX |     tasks.push(task);
  |     ^^^^^ `tasks` is a `&` reference, so the data it refers to cannot be borrowed as mutable

Lo que sabe el compilador

&Vec<Task> es una referencia de solo lectura. No puede usarse para modificar lo que apunta. push añade un elemento - eso es una modificación. El compilador lo ve.

En el capítulo 1.5 la misma situación se resolvió añadiendo mut: task_complete tomaba &mut Task en lugar de &Task. El principio es el mismo aquí - solo cambia el receptor:

fn add(tasks: &mut Vec<Task>, task: Task) {
    tasks.push(task);
}

&mut Vec<Task> es una referencia mutable: la función modifica la lista sin tomar su propiedad.

El conjuro

fn main() {
    let mut tasks: Vec<Task> = Vec::new();

    add(&mut tasks, Task::new(1, "Buy coffee"));
    add(&mut tasks, Task::new(2, "Buy milk"));
    add(&mut tasks, Task::new(3, "Buy eggs"));

    let task = &mut tasks[0];
    task.complete();

    if task.is_done() {
        println!("Task 1 done");
    }

    for task in &tasks {
        println!("#{}: {} - {:?}", task.id, task.title, task.status);
    }
}
Task 1 done
#1: Buy coffee - Done
#2: Buy milk - Todo
#3: Buy eggs - Todo

make ci pasa. add tiene nombre - la lista ya no se rellena a mano.

El código completo de tq para este capítulo está en 1-a-task/09-the-list-at-work/.