Lección 2
Expresiones y funciones
Distingue una expresión de una sentencia, tipa parámetros y elige entre expresión final y return explícito.
Todo vale algo, hasta que le pones un punto y coma
En «Variables, funciones y control de flujo» ya llamaste a una función,
boost(), sin nombrar por qué su última línea no llevaba ;. Aquí
formalizamos eso: qué es una expresión, qué es una sentencia, y por qué esa
diferencia decide si tu función compila o no.
Rust construye casi todo a partir de expresiones: un bloque {}, un if,
una llamada a función, todos producen un valor. Una sentencia, en cambio, no
produce nada útil. Saber en cuál de los dos casos estás es la base para leer
—y escribir— cualquier función Rust con confianza.
Verás cuatro estaciones: funciones y llamadas, parámetros tipados, expresiones frente a sentencias, y las dos formas de devolver un valor.
Ejercicio 01 · Fibonacci
Calcula el n-ésimo término de Fibonacci de forma iterativa.
El starter ya declara la firma con el tipo de retorno correcto. Completa el cuerpo con un bucle que avance dos acumuladores en cada vuelta.
Objetivo
Completa fibonacci para que devuelva el n-ésimo término de la sucesión (0-indexado: fibonacci(0) == 0).
Implementa
Sustituye `todo!` por un bucle `for` que actualice dos variables en cada vuelta.
Función 01
Calcular Fibonacci iterativamente
Usa dos variables mutables que avanzan una posición en cada vuelta del bucle y devuelve la primera al terminar.
/// Returns the n-th Fibonacci number (0-indexed: fibonacci(0) == 0).
pub fn fibonacci(n: u32) -> u64 {
todo!("iterate n times, swapping a and b to compute the n-th Fibonacci number")
}Comprueba
Ejecuta los 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.
/// Returns the n-th Fibonacci number (0-indexed: fibonacci(0) == 0).
#[must_use]
pub fn fibonacci(n: u32) -> u64 {
let (mut a, mut b) = (0u64, 1u64);
for _ in 0..n {
let next = a + b;
a = b;
b = next;
}
a
}
// Playground entry point for this example.
fn main() {
println!("{}", fibonacci(10));
}Resumen
fndeclara una función; llamarla ejecuta su cuerpo, definirla no.- Cada parámetro tiene su propio tipo; junto con el tipo de retorno forman la firma de la función.
- Una expresión produce un valor; un
;de más la convierte en una sentencia que vale(). - Un error
E0308conexpected T, found ()casi siempre significa un;sobrante en la expresión final. - La expresión final de una función es su retorno implícito;
returnsirve para salidas anticipadas. - El tipo unidad
()no ocupa memoria: es el valor por defecto cuando una función no devuelve nada útil.