09 · Estructuras de Datos
Entradas condicionales en arrays
Usa if condición => valor y for elemento in elementos => valor dentro de un array. Las entradas se producen en el orden escrito. Las condiciones falsas omiten entradas; nil ocupa una posición. Los arrays anidados siguen siendo valores sin un spread explícito.
En esta página
Usa if condición => valor y for elemento in elementos => valor dentro de un array. Las entradas se producen en el orden escrito. Las condiciones falsas omiten entradas; nil ocupa una posición. Los arrays anidados siguen siendo valores sin un spread explícito.
Ejemplo completo
Entradas condicionales en arrays.
// Mix ordinary values, conditional entries and loops in one array.
struct Page { title: str, enabled: bool }
let admin = true
let pages = [
Page { title: "Reports", enabled: true },
Page { title: "Drafts", enabled: false },
]
let menu = [
"Home",
if admin => "Admin",
for page in pages => if page.enabled => page.title,
]
for title in menu { print(title) }
// expected: Home
// expected: Admin
// expected: Reports
let positions = [for position, page in pages => position + 10]
print(positions[0])
// expected: 10
print(positions[1])
// expected: 11
let flattened = [0, for row in [[1, 2], [3]] => for cell in row => cell, 4]
print(flattened.len())
// expected: 5
let with_nil = [if true => nil, 7]
print(with_nil.len())
// expected: 2
Reglas y comportamiento
Condiciones y recuperación de errores · Documentación
Desde un checkout del repositorio:
zolo examples/features/04-control-flow/24-array-entries.zolo
Conservar solo las entradas que coinciden
El constructor filtra los patrones antes de evaluar la entrada. El ejemplo cuenta las evaluaciones para mostrar que la lectura con error no ejecuta el cuerpo.
// Failed readings produce neither an entry nor a body evaluation.
let readings: [Result<int, str>] = [.Ok(3), .Err("offline"), .Ok(5)]
var evaluated = 0
fn double(value: int) -> int { evaluated += 1; value * 2 }
let values = [for case .Ok(value) in readings => double(value)]
print(values[0]) // expect: 6
print(values[1]) // expect: 10
print(values.len()) // expect: 2
print(evaluated) // expect: 2
let indexed = #{for case .Ok(value) in readings => [value]: value * 2}
print(indexed[3]) // expect: 6
print(indexed[5]) // expect: 10
Consulta también