Ir al contenido

If...Else en Rust

if le permite a tu programa tomar decisiones: ejecutar un bloque de código u otro, según una condición.

fn main() {
let age = 20;
if age >= 18 {
println!("Puedes votar");
}
}
▶ Pruébalo tú mismo

Fíjate en un par de detalles, porque suelen confundir a quien viene de otros lenguajes:

  • La condición no lleva paréntesis: se escribe if age >= 18, no if (age >= 18).
  • La condición tiene que ser un bool de verdad. if age (un número) no compila; necesitas algo como if age != 0.
fn main() {
let age = 15;
if age >= 18 {
println!("Puedes votar");
} else {
println!("Todavía no tienes la edad");
}
}
▶ Pruébalo tú mismo
fn main() {
let score = 72;
if score >= 90 {
println!("Nota: A");
} else if score >= 75 {
println!("Nota: B");
} else if score >= 60 {
println!("Nota: C");
} else {
println!("Nota: F");
}
}
▶ Pruébalo tú mismo

Rust revisa cada condición de arriba hacia abajo y ejecuta la primera que se cumple, tal como esperarías.

Esto es algo que Rust hace y muchos lenguajes no: if puede producir un valor. Eso significa que puedes usarlo a la derecha de un let:

fn main() {
let age = 20;
let status = if age >= 18 { "adulto" } else { "menor" };
println!("{status}");
}
▶ Pruébalo tú mismo

Funciona igual que cuando una función devuelve un valor: no se pone punto y coma después del valor en cada rama. Solo hay un requisito: las dos ramas deben producir el mismo tipo (aquí, ambas son &str).

Puedes poner un if dentro de otro if. Funciona, pero con dos o tres niveles de profundidad se vuelve difícil de leer. Muchas veces puedes unir las condiciones con los operadores lógicos && (y) y || (o):

fn main() {
let temperature = 22;
let is_raining = false;
// Anidado: funciona, pero se va desplazando a la derecha
if temperature > 15 {
if !is_raining {
println!("Anidado: sal a caminar");
}
}
// La misma comprobación en una sola condición
if temperature > 15 && !is_raining {
println!("Combinado: sal a caminar");
}
// || es verdadero si cualquiera de los dos lados lo es
if temperature < 0 || temperature > 35 {
println!("Quédate en casa");
} else {
println!("Hace buen tiempo");
}
}

Salida:

Anidado: sal a caminar
Combinado: sal a caminar
Hace buen tiempo
▶ Pruébalo tú mismo

Anidar sigue teniendo sentido cuando el bloque interior hace algo más, o cuando tiene su propio else. Pero cuando el if exterior solo sirve para proteger al interior, && dice lo mismo de forma más sencilla. Para comprobar que un número está dentro de un rango, escribe temperature >= 15 && temperature <= 25. Rust no permite 15 <= temperature <= 25.

Guarda un número n = 7. Usa if como expresión para darle a una variable kind el valor "par" o "impar", y luego imprime 7 es impar. Pista: un número es par cuando n % 2 == 0.

Ver solución
fn main() {
let n = 7;
let kind = if n % 2 == 0 { "par" } else { "impar" };
println!("{n} es {kind}");
}

Salida:

7 es impar
▶ Pruébalo tú mismo

Un cine cobra 5 dólares a los menores de 12 años, 7 a las personas de 65 años o más y 12 a todos los demás. Guarda una age de 70, calcula el price con una sola expresión if / else if / else e imprime Entrada: $7. Pista: cada rama tiene que devolver un número, y el if completo termina con un punto y coma después de la última }.

Ver solución
fn main() {
let age = 70;
let price = if age < 12 {
5
} else if age >= 65 {
7
} else {
12
};
println!("Entrada: ${price}");
}

Salida:

Entrada: $7
▶ Pruébalo tú mismo
  • if condición { ... }: no hacen falta paréntesis y la condición debe ser un bool.
  • Encadena más comprobaciones con else if y deja un caso por defecto con else.
  • Une condiciones con && y || en lugar de anidar un if dentro de otro.
  • if se puede usar como expresión para producir un valor: las dos ramas deben tener el mismo tipo y necesitas un else.

Comprueba lo aprendido

1. ¿Qué es obligatorio en la condición de un if en Rust?

2. Cuando usas if como expresión con let, ¿qué deben cumplir las dos ramas?

Puntuación: 0 / 2