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.
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.