if let
if let es una construcción compacta de pattern matching que combina una verificación condicional y un binding en una sola expresión. Es especialmente útil cuando solo importa una variante de un enum y se quiere evitar la verbosidad de un match completo.
Código
// if let: destructurar Option sin match completo
fn find_even(nums: Array, start: int) -> Option<int> {
let len: int = nums.length()
var i: int = start
while i < len {
let v: int = nums[i]
if v % 2 == 0 {
return Option.Some(v)
}
i = i + 1
}
return Option.None
}
fn main() -> int {
let data: Array = [1, 3, 4, 7, 8, 10]
// if let extrae el valor si es Some
let a: Option<int> = find_even(data, 0)
if let Option.Some(v) = a {
print("primer par desde 0: " + int_to_string(v))
} else {
print("no hay pares")
}
// buscar desde índice 4 (8 y 10 son pares)
let b: Option<int> = find_even(data, 4)
if let Option.Some(v) = b {
print("primer par desde 4: " + int_to_string(v))
} else {
print("no hay pares desde 4")
}
// Array sin pares: retorna None -> ejecuta else
let odds: Array = [1, 3, 5, 7]
let c: Option<int> = find_even(odds, 0)
if let Option.Some(v) = c {
print("par encontrado: " + int_to_string(v))
} else {
print("no hay pares en odds")
}
return 0
}
Salida
primer par desde 0: 4 primer par desde 4: 8 no hay pares en odds
Explicación
find_even recorre un array a partir de un índice dado y retorna el primer número par envuelto en Option.Some, o Option.None si no se encuentra ninguno. Este es un patrón típico para funciones de búsqueda: el tipo de retorno comunica "encontrado o no encontrado" a través del sistema de tipos en lugar de un valor centinela mágico.
La sintaxis if let Option.Some(v) = a evalúa el patrón Option.Some(v) contra el valor a. Si coincide, el valor interno se asigna a v y el cuerpo del if se ejecuta con v en scope. Si el patrón no coincide (es decir, el valor es Option.None), se ejecuta en cambio la rama else. Esto es exactamente equivalente a un match de dos brazos pero encaja de forma más natural en código de estilo imperativo.
La tercera llamada usa un array puramente impar para demostrar que se toma la rama else. Nótese que cada bloque if let introduce un binding v nuevo cuyo scope está limitado a ese bloque — no hay riesgo de que el binding del primer bloque se filtre al segundo o al tercero.
Source: examples/by-example/27-if-let.nx