Lección 1
Variables, mutabilidad y tipos
Distingue mut de shadowing, reconoce los tipos escalares de Rust y agrupa valores con tuplas y arrays.
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.
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.
Objetivo
Completa split_kilometers para que devuelva (kilometros_completos, metros_sobrantes) a partir de una distancia total en metros.
Implementa
Sustituye `todo!` por la división y el resto de `total_meters` entre 1000.
Función 01
Separar kilómetros y metros
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)")
}Comprueba
Ejecuta tres casos visibles y usa el diagnóstico para corregir el código.
Pruebas visibles
Modifica el código antes de ejecutar las pruebas.
Ayuda
Consulta pistas progresivas o compara con la solución.
/// Splits a total distance in meters into whole kilometers and the remaining meters.
#[must_use]
pub fn split_kilometers(total_meters: u32) -> (u32, u32) {
let kilometers = total_meters / 1000;
let remaining_meters = total_meters % 1000;
(kilometers, remaining_meters)
}
// Playground entry point for this example.
fn main() {
let (km, m) = split_kilometers(1500);
println!("{km} {m}");
}Resumen
letcrea variables inmutables por defecto;let mutdeclara explícitamente que una variable cambiará.- Shadowing rebina un nombre con un nuevo
lety puede cambiar de tipo;mutcambia el valor sin poder cambiar su tipo. - Rust tiene cuatro tipos escalares: enteros (
i32por defecto), decimales (f64por defecto),boolychar. - 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.