Saltar al contenido

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.

24-array-entries.zolo
Playground
// 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.

09-filtered-builders.zolo
Playground
// 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

Índice global

Encuentra tu camino por Zolo

Prueba una idea

Empieza aquí

9 resultados

9 resultados

enespt-br