flakolefluk.dev

Aprendiendo Rust en público - If (1)

Luego de una pequeña pausa (15 días, wtf), continuamos aprendiendo Rust.

En esta oportunidad comenzaremos con el condicional if.

Una expresión if puede alterar la manera en que nuestra aplicación fluye (control flow), creando una bifurcación o ramas.

Vamos al ejercicio.

// if1.rs

pub fn bigger(a: i32, b: i32) -> i32 {
// Complete this function to return the bigger number!
// Do not use:
// - another function call
// - additional variables
// Execute `rustlings hint if1` for hints
}

// Don't mind this for now :)
#[cfg(test)]
mod tests {
use super::*;

#[test]
fn ten_is_bigger_than_eight() {
assert_eq!(10, bigger(10, 8));
}

#[test]
fn fortytwo_is_bigger_than_thirtytwo() {
assert_eq!(42, bigger(32, 42));
}
}

Vamos a obviar la sección de los tests (donde dice `#[cfg(test)]), siguiendo la instrucción.

Podemos ver una función que recibe dos valores de tipo i32 y que debiera retornar un valor de tipo i32 (el mayor de los dos).

Como la función no tiene nada aún podemos esperar un error en el tipo de valor retornado.

Veamoslo:

⚠️  Compiling of exercises/if/if1.rs failed! Please try again. Here's the output:
error[E0308]: mismatched types
--> exercises/if/if1.rs:5:34
|
5 | pub fn bigger(a: i32, b: i32) -> i32 {
| ------ ^^^ expected `i32`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression

error: aborting due to previous error

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

Correcto. Tenemos un error en lo que retorna la funcion.

Según esta sección del libro de Rust, la expresión se construye de la siguiente manera: if <condición>, donde la condición es un valor o expresión verdadera o falsa.

Volvamos al ejercicio, podemos resolverlo de (al menos) dos maneras.

// if1.rs

pub fn bigger(a: i32, b: i32) -> i32 {
if (a > b) {
return a;
}

return b;
}

o

// if1.rs

pub fn bigger(a: i32, b: i32) -> i32 {
if (a > b) {
return a;
} else {
return b;
}
}

En ambos casos el resultado es el mismo, pero en el segundo estamos usando el keyword else que ejecuta lo que esta dentro de esa rama si el resultado de la condición de if es falso.

En otras palabras en el caso uno decimos: "toma el camino para retornar a si la condición es verdadera, de lo contrario sigue con el flujo normal (retornar b)."
La segunda opción sería algo como: "si la condicion es verdadera tomo el camino que retorna a. Si la condicion es falsa, toma el camino que retorna b."

Usamos el operador > para verificar si aes mayor que b. En el caso de ser iguales da lo mismo cual de los dos devolver ya que el valor es el mismo, pero de la forma en que estructuramos la función, estamos devolviendo b.

Nuestra función compila ahora, y por el mensaje entregado por el cli de rustings, los tests pasaron también. Buen trabajo!

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