Lección 4

Cómo leer al compilador

Descifra la estructura de un error de rustc, diagnostica un error de tipos y un nombre no resuelto, y aprende a distinguir warnings de errores.

Nivel
Introducción
Duración
20 min
Actualizada

El primer error rojo no es un callejón sin salida

En la lección anterior recorriste el ciclo check → build → run. Tarde o temprano uno de esos comandos va a fallar y la terminal se va a llenar de texto en rojo. Esa reacción de “esto es ilegible” es la más común al empezar, pero el mensaje tiene una estructura fija y, casi siempre, te dice exactamente qué arreglar y dónde.

Mapa del paso

  • TAREA · texto en rojoparece ruido a primera vista
  • HERRAMIENTA · estructura fijaerror[E####], -->, ^^^
  • RESULTADO · sabes qué mirarlínea, columna, motivo
01 / 04ERROR[CÓDIGO] · UBICACIÓN · CAUSA

Lee un error de tipos

lib.rsNo compila
fn add_one(number: i32) -> i32 {
    number + 1
}

fn main() {
    let result = add_one("3"); // ERROR: expected `i32`, found `&str`
    println!("{result}");
}
El compilador dice (E0308)

mismatched types. add_one espera un i32 y recibió un &str.

error[E0308]: mismatched types
--> src/main.rs:6:26
|
6 |     let result = add_one("3");
|                  ------- ^^^ expected `i32`, found `&str`
|                  |
|                  arguments to this function are incorrect
|
note: function defined here
--> src/main.rs:1:4
|
1 | fn add_one(number: i32) -> i32 {
|    ^^^^^^^ -----------

El mensaje señala dos sitios a la vez: dónde llamaste a la función con el tipo equivocado (^^^) y dónde se definió esa función (note:). Para arreglarlo, conviertes el valor al tipo correcto o cambias la firma; aquí faltaría parsear "3" a i32 antes de llamar a add_one.

Cuando el compilador te sugiere el nombre

lib.rsNo compila
fn main() {
    let energy = 4;
    println!("{energie}"); // ERROR: cannot find value `energie`
}
El compilador dice (E0425)

cannot find value `energie` in this scope. Existe una variable parecida: energy.

error[E0425]: cannot find value `energie` in this scope
--> src/main.rs:3:16
|
3 |     println!("{energie}");
|                ^^^^^^^
|
help: a local variable with a similar name exists
|
3 -     println!("{energie}");
3 +     println!("{energy}");
|

Aquí el help: no solo dice qué está mal, propone el arreglo exacto: borrar energie y escribir energy. Cuando rustc encuentra un nombre parecido declarado cerca, casi siempre lo sugiere así.

Un warning no te detiene

lib.rsCompila
fn main() {
    let energy = 4;
    println!("still compiles");
}
El compilador dice (unused_variables)

warning, no error: el programa compila y se ejecuta igual.

warning: unused variable: `energy`
--> src/main.rs:2:9
|
2 |     let energy = 4;
|         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_energy`
|
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default

cargo build/cargo run terminan igual: el binario se genera, se ejecuta, e imprime still compiles. El warning queda solo como aviso en la terminal, no como bloqueo.

Profundiza con rustc –explain

Pide la explicación larga de un códigomacOS · Linux · PowerShell
rustc --explain E0308

Cualquier código con forma E#### acepta este comando: imprime la misma explicación extendida que existe en el índice oficial de errores, pero sin conexión y sin salir de la terminal.

Qué no cubre esta lección

  • No cubre los errores del borrow checker (E0502, E0499…): eso llega con el módulo de ownership.
  • No repite los lints de Clippy, ya vistos en la lección de instalación: Clippy avisa de estilo e idiomatismo, rustc de si el programa es válido.
  • No explica cómo tu editor muestra estos mismos diagnósticos subrayados en vivo: eso es rust-analyzer, también visto antes.

Qué sigue

Con la capacidad de leer un error y saber qué mirar, el siguiente bloque del temario entra en la sintaxis real de Rust: variables, tipos, expresiones y funciones, la base sobre la que vas a escribir cada programa a partir de ahora.

Resumen

  • Un error de rustc tiene estructura fija: error[CÓDIGO], una flecha --> con la ubicación exacta, el fragmento señalado con ^^^, y bloques opcionales note:/help:.
  • E0308 (tipos que no encajan) señala tanto la llamada como la definición involucrada; no hay conversión implícita entre tipos en Rust.
  • E0425 (nombre no encontrado) suele venir con un help: que propone directamente el nombre correcto si hay uno parecido cerca.
  • Un warning no detiene la compilación ni la ejecución; un error sí. rustc --explain E#### amplía cualquier código sin conexión.

Fuentes