A biblioteca padrão do Cairo implementa um tipo Array.
Ele é parecido com os tipos de array comuns em outras linguagens de programação, mas com algumas diferenças importantes:
Array, e só podem ser removidos com eficiência do início.Arrays podem ser criados com a função ArrayTrait::new e também com a macro array!:
let empty: Array<u32> = ArrayTrait::new();
let one_to_four = array![1, 2, 3, 4];
Elementos podem ser adicionados ao array com a função ArrayTrait::append:
let mut num_array = array![1, 2, 3, 4];
num_array.append(5);
// -> [1, 2, 3, 4, 5]
Elementos podem ser removidos do array com a função ArrayTrait::pop_front:
let mut one_to_four = array![1, 2, 3, 4];
one_to_four.pop_front();
// -> [2, 3, 4]
O Cairo também introduz um tipo Span, que funciona como um "snapshot" do Array.
Todo Array pode ser convertido em um Span com a função ToSpanTrait::span:
let one_to_four = array![1, 2, 3, 4];
let one_to_four_span = one_to_four.span();
// -> [1, 2, 3, 4]
Converter um array em um Span é muito eficiente, porque Span é apenas uma estrutura de dados que permite ao Cairo "ver" uma seção do array. Ele não modifica o array de forma alguma.
Ao converter um array em um Span, o Cairo permite realizar mais operações do que seria permitido diretamente em Array, como remover um item do início do span.
let one_to_four = array![1, 2, 3, 4];
let mut one_to_four_span = one_to_four.span();
one_to_four_span.pop_back();
// -> [2, 3, 4]
Repare que tivemos que tornar one_to_four_span mutável com a palavra-chave mut para chamar pop_back, que modifica o span encurtando a seção do array que o span está "vendo".
Como aprendiz de mágica, Elyse precisa praticar o básico.
Ela tem uma pilha de cartas que quer manipular.
Para facilitar um pouco as coisas, ela usa apenas as cartas de 1 a 10.
A pilha de cartas é representada por um Array, com a base da pilha na frente do array e o topo da pilha no final.
Implemente a função insert_top que retorna uma cópia da pilha com a nova carta informada adicionada ao topo da pilha.
let stack = array![5, 9, 7, 1];
insert_top(stack, 8);
// -> [5, 9, 7, 1, 8]
Implemente a função remove_top_card que retorna uma cópia da pilha com a carta do topo removida.
Se a pilha informada estiver vazia, a pilha original deve ser retornada, sem alterações.
let stack = array![3, 2, 6, 4, 8];
remove_top_card(stack);
// -> [3, 2, 6, 4]
Implemente a função insert_bottom que retorna uma cópia da pilha com a nova carta informada adicionada à base da pilha.
let stack = array![5, 9, 7, 1];
insert_bottom(stack, 8);
// -> [8, 5, 9, 7, 1]
Implemente a função remove_bottom_card que retorna uma cópia da pilha com a carta da base removida.
Se a pilha informada estiver vazia, a pilha original deve ser retornada, sem alterações.
let stack = array![8, 5, 9, 7, 1];
remove_bottom_card(stack);
// -> [5, 9, 7, 1]
Implemente a função check_size_of_stack que verifica se o tamanho da pilha é igual a um stack_size informado ou não.
let stack = array![3, 2, 6, 4, 8];
check_size_of_stack(stack, 4);
// -> false
Para entender por que trabalhar com arrays em Cairo não é tão simples quanto em outras linguagens de programação, é bom ter em mente que Cairo usa um modelo de memória imutável. Ou seja, depois que uma célula de memória recebe um valor, ela nunca mais pode ser sobrescrita, apenas lida.
A linguagem abstrai um pouco essa característica, permitindo que quem programa declare e use suas variáveis como se fossem mutáveis.
Embora isso torne a escrita de código um pouco mais desafiadora, especialmente de código que usa o tipo Array (incluindo ByteArray, que por baixo é um "array de bytes"), ela permite escrever programas demonstráveis, que podem ser executados com confiança até em máquinas não confiáveis, o que faz essa troca valer muito a pena.
Crie sua conta no Exercism para aprender e dominar Cairo com 25 conceitos68 exercícios e mentoria humana de verdade, tudo de graça.