Pular para o conteúdo

Guia 24 de 53

Arrays fixos e tamanhos genéricos constantes

Confira o tamanho exato de um pacote e infira esse tamanho em funções reutilizáveis.

Nesta página

Um array fixo registra o tamanho no tipo. Use essa forma quando um pacote, uma coordenada ou um lote precisa conter uma quantidade exata de elementos.

struct Buffer<const N: int> {
    bytes: [int; N]
}

fn sum<const N: int>(samples: [int; N]) -> int {
    let total = 0
    for sample in samples {
        total += sample
    }
    total
}

let packet: Buffer<3> = Buffer { bytes: [12, 18, 30] }
print(sum(packet.bytes))

O compilador verifica que o literal contém três inteiros. A função infere o tamanho pelo argumento. Dentro de uma função genérica constante, N é um inteiro imutável e pode ser usado como tamanho do array. Uma referência de função inferida ou guardada em um campo conserva esse contrato. Os argumentos padrão são preenchidos antes de o compilador fornecer o tamanho.

Tamanhos conhecidos na compilação

Tamanhos aceitam literais inteiros não negativos e constantes inteiras do módulo. A aritmética segue as regras de Zolo: 2 + 1, 7 ~/ 2 e -1 % 3 produzem 3, 3 e 2. O operador / produz float e não define um tamanho inteiro. Overflow, divisão por zero, variáveis de execução e expressões simbólicas como N + 1 geram diagnóstico.

Operações permitidas

Arrays fixos aceitam leitura, iteração e operações que conservam o tamanho. Para substituir um elemento, o índice deve ser um inteiro conhecido dentro dos limites.

let point: [int; 2] = [4, 7]
point[0] = 5
print(point[1])

Um array fixo não pode perder a verificação de tamanho por uma anotação, cast, adaptação de função ou parâmetro genérico sem restrição. Ao passá-lo a uma função auxiliar, escreva um parâmetro [T; N].

Construção e limites atuais

Campos com tamanho concreto e valor padrão recebem elementos novos a cada construção. Um tipo nominal genérico constante precisa de campos explícitos ou de uma fábrica que receba o array fixo. Default automático e valores padrão de campos ainda não transportam esse tamanho. Parâmetros constantes precisam aparecer na estrutura do tipo; identidade nominal baseada apenas em um parâmetro sem uso não é suportada.

Em impl Buffer<N>, o tamanho está disponível em anotações. Para usá-lo como valor de execução ou encaminhá-lo a outra função genérica constante, declare um parâmetro constante na função. Funções genéricas constantes rejeitam argumentos variádicos, @inline escrito no código e parâmetros que ocultam o nome do tamanho. Reificação se aplica a parâmetros de tipo, não a parâmetros inteiros constantes.

A representação usa o array existente e conserva a prova de tamanho no frontend. Schemas verificam os tipos dos elementos e o tamanho exato. Adaptadores ABI estrangeiros e o parser de CLI @arg informam que arrays fixos ainda não são suportados.

Pratique no By Example.

DOCS / OPINIÃO

Esta página deixou alguma pergunta?

Conte onde a explicação perdeu você. A documentação também faz parte da experiência da linguagem.

Índice global

Encontre seu caminho pela Zolo

Experimente uma ideia

Comece por aqui

9 resultados

9 resultados

enespt-br