Patrones Anidados
En esta página
Cualquier posición de subpatrón acepta otro patrón completo. Esto permite
extraer datos de estructuras arbitrariamente profundas — enum dentro de array,
struct que contiene enum, enum dentro de enum — sin necesidad de anidar múltiples
match ni usar variables temporales.
Enum dentro de array; struct que contiene enum; enum dentro de enum.
12-nested-patterns.zolo
// Feature: Nested patterns — combining everything
// Syntax: subpatterns inside subpatterns
// When to use: extract data from deep structures in a single pass
// without nesting `match` or `if let`.
enum Maybe<T> {
Just(T),
Nothing,
}
// Enum INSIDE array.
let opts = [Maybe.Just(1), Maybe.Nothing, Maybe.Just(3)]
for o in opts {
let label = match o {
Maybe::Just(n) => "got {n}",
Maybe::Nothing => "none",
}
print(label)
}
// Struct containing an enum.
struct Box {
label: str,
content: Maybe<int>,
}
let b1 = Box { label: "alpha", content: Maybe.Just(10) }
let b2 = Box { label: "beta", content: Maybe.Nothing }
fn describe_box(b: Box) -> str {
return match b {
Box { label, content: Maybe::Just(n) } => "{label} = {n}",
Box { label, content: Maybe::Nothing } => "{label} = empty",
}
}
print(describe_box(b1)) // alpha = 10
print(describe_box(b2)) // beta = empty
// Enum nested in enum.
enum Result2 {
Ok(Maybe<int>),
Err(str),
}
let r1 = Result2.Ok(Maybe.Just(42))
let r2 = Result2.Ok(Maybe.Nothing)
let r3 = Result2.Err("failed")
fn classify(r: Result2) -> str {
return match r {
Result2::Ok(Maybe::Just(n)) => "ok with {n}",
Result2::Ok(Maybe::Nothing) => "ok but empty",
Result2::Err(msg) => "error: {msg}",
}
}
print(classify(r1)) // ok with 42
print(classify(r2)) // ok but empty
print(classify(r3)) // error: failed
El ejemplo anterior muestra tres formas de anidamiento:
- Enum en iteración — el
matchdentro delfordesestructura cada elemento del array directamente. - Struct con campo enum — el patrón
Box { label, content: Maybe::Just(n) }hace coincidir el campocontentcon un subpatrón de enum, extrayendolabelynen una sola rama. - Enum en enum —
Result2::Ok(Maybe::Just(n))atraviesa dos niveles de variante en una línea.
La regla general es: dondequiera que un patrón espere un valor, puedes colocar otro patrón más específico.
Consulta también