Cairo não tem um tipo nativo para strings, mas oferece duas formas de lidar com elas: strings curtas com aspas simples e ByteArray com aspas duplas.
Uma string curta é uma string ASCII em que cada caráter é codificado num único byte.
O tipo que Cairo usa por predefinição para strings curtas é felt252, o que faz com que o seu comprimento máximo seja apenas 31 carateres.
// below are different ways to write the same value
let name: felt252 = 'Jane'; // short string format
let name: felt252 = 0x4a616e65; // byte format
let name: felt252 = 1247899237; // decimal format
Tecnicamente, qualquer tipo inteiro menor do que felt252 pode ser representado com o formato de string curta.
// all of the below are equal u8 values, they are just written using different formats!
let lowercase_a_in_ascii: u8 = 'a'; // short string format
let lowercase_a_in_ascii: u8 = 0x61; // byte format
let lowercase_a_in_ascii: u8 = 97; // decimal format
Para strings com mais de 31 carateres, Cairo disponibiliza ByteArray, que tem um comprimento ilimitado.
let long_string: ByteArray = "this is a string which has more than 31 characters";
Os ByteArrays podem ser concatenados através do operador +:
"Jane" + " " + "Austen"
// => "Jane Austen"
Alguns carateres especiais têm de ser escapados com uma barra invertida, como \t para uma tabulação e \n para uma nova linha em strings.
"How is the weather today?\nIt's sunny"
// =>
// How is the weather today?
// It's sunny
Podes até aceder a bytes individuais dentro de um ByteArray através do seu índice.
Tem cuidado, no entanto: o tipo do byte devolvido é u8 e não ByteArray!
let hello: ByteArray = "Hello World!";
let exclamation_mark: u8 = hello[11];
// => 33
A biblioteca principal disponibiliza muitos métodos e operadores úteis para trabalhar com ByteArrays.
Para mais informações sobre os métodos de ByteArray, consulta a documentação de ByteArrayTrait.
Aqui estão alguns exemplos:
let name: felt252 = 'Jane';
let mut greeting: ByteArray = "Welcome ";
// append_word appends a single word of a given number of bytes to the end of the ByteArray
greeting.append_word(name, 4);
// => "Welcome Jane"
// rev returns a ByteArray with the all characters reversed
let rev_greeting = greeting.rev();
// => "enaJ emocleW"
Há uma loja de eletrodomésticos chamada "Tech Palace" aqui perto. A dona da loja instalou recentemente um grande ecrã para usar em mensagens publicitárias e para mostrar uma saudação especial quando os clientes passam os cartões de fidelização à entrada. O ecrã é composto por muitas pequenas luzes LED e consegue mostrar várias linhas de texto.
A dona da loja precisa da tua ajuda com o código que é usado para gerar o texto do novo ecrã.
Para a maioria dos clientes que passam os cartões de fidelização, a dona da loja quer ver Welcome to the Tech Palace, seguido do nome do cliente em letras maiúsculas no ecrã.
Implementa a função welcome_message que aceita o nome do cliente como argumento, uma string curta (felt252), e devolve a mensagem pretendida como uma ByteArray.
welcome_message("Judy")
// => Welcome to the Tech Palace, JUDY
Para os clientes fiéis que compram muito na loja, a dona quer que o ecrã de boas-vindas fique mais vistoso, acrescentando uma linha de estrelas antes e depois da mensagem de boas-vindas. Ainda não sabe ao certo quantas estrelas devem estar nas linhas, por isso quer que isso seja configurável.
Escreve uma função add_border que aceita como argumentos uma mensagem de boas-vindas (uma ByteArray) e o número de estrelas por linha (do tipo u32).
Deve devolver uma ByteArray composta por 3 linhas: uma linha com o número de estrelas pretendido, depois a mensagem de boas-vindas tal como foi recebida e, por fim, outra linha de estrelas.
add_border("Welcome!", 10)
Deve devolver o seguinte:
**********
Welcome!
**********
Antes de instalar este novo ecrã, a loja tinha um ecrã semelhante que só conseguia mostrar linhas estáticas e não configuráveis. A dona gostaria de reutilizar algumas das mensagens publicitárias antigas no novo ecrã. No entanto, os dados já incluem uma moldura de estrelas e alguns espaços em branco indesejados. A tua tarefa é limpar as mensagens para que possam ser reutilizadas.
Implementa uma função clean_up_message que aceita a mensagem publicitária antiga como uma ByteArray.
A função deve primeiro remover todas as estrelas do texto e, depois, remover os espaços em branco no início e no fim do texto restante.
A função deve depois devolver a mensagem limpa.
let message: ByteArray = "
**************************
* BUY NOW, SAVE 10% *
**************************
";
clean_up_message(message)
// => BUY NOW, SAVE 10%
Inscreve-te no Exercism para aprenderes e dominares Cairo com 25 conceitos68 exercícios, e mentoria humana real, tudo grátis.