flakolefluk.dev

Aprendiendo Rust en público - Funciones (5)

Hemos llegado al último ejercicio de funciones de rustlings.

Comencemos de inmediato revisando el código.

// functions5.rs

fn main() {
let answer = square(3);
println!("The answer is {}", answer);
}

fn square(num: i32) -> i32 {
num * num;
}

Y el error

⚠️  Compiling of exercises/functions/functions5.rs failed! Please try again. Here's the output:
error[E0308]: mismatched types
--> exercises/functions/functions5.rs:11:24
|
11 | fn square(num: i32) -> i32 {
| ------ ^^^ expected `i32`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
12 | num * num;
| - help: consider removing this semicolon

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.

Por si no lo notaron, el error está directamente relacionado con algo comentado en el post anterior.

La función retornará algo explícitamente con el keyword return o retornará la última expresión de esta. Sin embargo es muy importante diferenciar una expresión de un statement. Un statement no retorna nada y se diferenciará con el punto y coma (,) final. Una expresión, en cambio, será evaluada y retornará un valor.

En este caso, la funcion square no tiene ninguna expresión, por lo tanto, nada que retornar, no cumpliendo con la firma de la función que indica que debe retornar un valor de tipo i32.

Para corregir el error nos bastará con quitar el punto y coma final, para que el contenido de la función sea la expresión num * num.

Nuestro ejercicio finalmente queda así:

// functions5.rs

fn main() {
let answer = square(3);
println!("The answer is {}", answer);
}

fn square(num: i32) -> i32 {
num * num
}

Felicidades! Hemos terminado los ejercicios de funciones de rustlings.

Les dejo un pequeño resumen de lo aprendido durante esta serie de ejercicios de funciones:

Para seguir esta serie, puedes buscar por el tag #aprendiendo_rust