flakolefluk.dev

Aprendiendo Rust en público - Funciones (3)

Luego de una pequeña pausa continuamos con el ejercicio 3 de funciones de rustlings.

Comencemos con el ejercicio:

// functions3.rs
fn main() {
call_me();
}

fn call_me(num: i32) {
for i in 0..num {
println!("Ring! Call number {}", i + 1);
}

¿Ya vieron el error?

Veamos que nos dice el compilador.

⚠️  Compiling of exercises/functions/functions3.rs failed! Please try again. Here's the output:
error[E0061]: this function takes 1 parameter but 0 parameters were supplied
--> exercises/functions/functions3.rs:7:5
|
7 | call_me();
| ^^^^^^^^^ expected 1 parameter
...
10 | fn call_me(num: i32) {
| -------------------- defined here

error: aborting due to previous error

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

¡Exacto! Al declarar la función call_me le informamos al compilador que la función debía recibir un parámetro de tipo i32, sin embargo cuando llamamos la función (línea 7 en el ejercicio), no le pasamos ninguno.

Para lograr compilar el ejercicio debemos agregar un parámetro que cumpla con los requisitos de i32.

// functions3.rs
fn main() {
call_me(3);
}

fn call_me(num: i32) {
for i in 0..num {
println!("Ring! Call number {}", i + 1);
}
}

¡Funciona!

Un pequeño detalle que me llamó la atención es que el parametro pedido es de tipo i32, lo que quiere decir que perfectamente podría pasar el valor negativo -3 a la función.

Me surgió entonces la duda, ¿qué significaría iterar de 0 a -3 en pasos de a 1, excluyendo el valor -3???
Primero pensé que el loop me daría algún error, pero no fue así, simplemente el loop no se ejecutó ninguna vez. El valor 0 no cumple con ser menor que el valor final (-3), luego, sale del loop antes de empezar.

Podría ser motivo para un pequeño PR en el repo de ruslings, o al menos para llevarlo a una pequeña discusión al respecto.

A la próxima ya les cuento cómo me fue con eso.

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