Lección 1

Variables, mutabilidad y tipos

Distingue mut de shadowing, reconoce los tipos escalares de Rust y agrupa valores con tuplas y arrays.

Nivel
Inicial
Duración
22 min
Actualizada

Un mismo nombre, reglas distintas

En «Variables, funciones y control de flujo» viste let y mut con una metáfora sencilla, sin nombrar shadowing, tipos escalares con tamaño, ni tuplas o arrays. Aquí retomamos las mismas piezas con el vocabulario y el rigor que usarás en el resto del curso: qué tipo elige Rust por defecto, cuándo tienes que anotarlo tú, y qué diferencia real hay entre mutar un valor y rebindear un nombre.

Todo lo que sigue —de structs a iteradores— asume que distingues un let mut de un shadowing, y que reconoces los cuatro tipos escalares de Rust. Esta lección construye esa base con código que compila y se ejecuta, no solo con pseudocódigo.

Verás cinco estaciones: mutabilidad, shadowing, tipos escalares, tipos compuestos de tamaño fijo, e inferencia. Cada una termina con un ejemplo real que puedes ejecutar o editar.

Estado de la variable

  • ESTADO · attemptsvalor inicial: 3
  • REGLA · let mutel cambio queda declarado
  • RESULTADO · attempts actualizadosin mut, esto no compilaría
01 / 05LET · INMUTABLE POR DEFECTO

Qué cambia respecto a otros lenguajes

Lenguaje Declaración por defecto Cómo declaras que puede cambiar
JavaScript let es mutable por defecto No hace falta nada extra; const sí bloquea la reasignación
Python Toda variable es reasignable No existe una palabra clave para marcar una variable como inmutable
Rust let es inmutable por defecto Debes escribir mut explícitamente

La diferencia no es solo sintáctica: en Rust, “inmutable por defecto” significa que el compilador rechaza la reasignación antes de ejecutar nada, no que exista una convención que puedas ignorar.

Ejercicio 01 · Conversor de distancia

Divide una distancia en kilómetros completos y metros sobrantes.

El starter ya declara la firma con dos enteros de retorno agrupados en una tupla. Completa el cuerpo usando división entera y el operador módulo.

0/1correcta

Completa split_kilometers para que devuelva (kilometros_completos, metros_sobrantes) a partir de una distancia total en metros.

01

Implementa

Sustituye `todo!` por la división y el resto de `total_meters` entre 1000.

Función 01

Separar kilómetros y metros

Sin cambios

Calcula los kilómetros completos con `/` y los metros sobrantes con `%`, y devuélvelos como tupla.

/// Splits a total distance in meters into whole kilometers and the remaining meters.
pub fn split_kilometers(total_meters: u32) -> (u32, u32) {
    todo!("return (total_meters / 1000, total_meters % 1000)")
}
02

Comprueba

Ejecuta tres casos visibles y usa el diagnóstico para corregir el código.

divide correctamente para distancias exactas y no exactas
Compilador

Modifica el código antes de ejecutar las pruebas.

03

Ayuda

Consulta pistas progresivas o compara con la solución.

Ejecuta un intento para desbloquear la solución.

Resumen

  • let crea variables inmutables por defecto; let mut declara explícitamente que una variable cambiará.
  • Shadowing rebina un nombre con un nuevo let y puede cambiar de tipo; mut cambia el valor sin poder cambiar su tipo.
  • Rust tiene cuatro tipos escalares: enteros (i32 por defecto), decimales (f64 por defecto), bool y char.
  • El desbordamiento de un entero produce panic en debug y wrapping en release.
  • Las tuplas agrupan tipos distintos y los arrays agrupan el mismo tipo; ambos tienen tamaño fijo.
  • El compilador infiere tipos casi siempre; cuando no puede decidir, como con parse, exige una anotación explícita.

Fuentes