09 · Estruturas de Dados
Entradas condicionais em arrays
Use if condição => valor e for item in itens => valor dentro de um array. Entradas são produzidas na ordem escrita. Condições falsas omitem entradas; nil ainda ocupa uma posição. Arrays aninhados continuam sendo valores sem um spread explícito.
Nesta página
Use if condição => valor e for item in itens => valor dentro de um array. Entradas são produzidas na ordem escrita. Condições falsas omitem entradas; nil ainda ocupa uma posição. Arrays aninhados continuam sendo valores sem um spread explícito.
Exemplo completo
Entradas condicionais em 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
Regras e comportamento
Condições e recuperação de erros · Documentação
A partir de um checkout do repositório:
zolo examples/features/04-control-flow/24-array-entries.zolo
Mantendo apenas as entradas que correspondem
O construtor filtra os padrões antes de avaliar a entrada. O exemplo conta as avaliações para mostrar que a leitura com erro não executa o corpo.
// 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
Veja também