Char é um tipo de dados em Crystal que representa um ponto de código Unicode de 32 bits.
O seu tamanho torna-os eficientes em termos de memória e dá-lhes propriedades específicas que as Strings não têm.
Criam-se com aspas simples (') e só permitem que se coloque lá dentro um único ponto de código Unicode.
'a' # => 'a'
'a'.class # => Char
É bastante comum trabalhar com Chars quando se trabalha com Strings em Crystal, já que vários métodos da classe String devolvem Chars ou recebem Chars como argumentos.
Por exemplo, o método String#[] devolve um Char, e o método String#chars devolve uma coleção de Chars.
Como um Char é um ponto Unicode de 32 bits, suporta incremento e decremento. Isso faz com que, se tiveres 'a', possas obter 'b' somando um.
'a' + 5
# => 'f'
'z' - 25
# => 'a'
Existe também um método chamado Char#succ, que devolve o caráter seguinte na tabela Unicode, e Char#pred, que devolve o caráter anterior na tabela Unicode.
'a'.succ
# => 'b'
'z'.pred
# => 'y'
Como um Char serve apenas para representar um ponto Unicode de 32 bits, dois Chars não podem ser concatenados. Por isso, um Char só pode ser concatenado com Strings.
'a' + "bc"
# => "abc"
'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char
O Crystal tem alguns métodos para obter informação sobre um caráter, como por exemplo se é um número ou uma letra, ou se é maiúsculo ou minúsculo. Eis uma lista de alguns desses métodos; para uma lista completa, consulta a API de Char:
| Método | Descrição |
|---|---|
Char#number? |
Devolve true se o Char for um número |
Char#letter? |
Devolve true se o Char for uma letra |
Char#lowercase? |
Devolve true se o Char for minúsculo |
Char#uppercase? |
Devolve true se o Char for maiúsculo |
Char#ascii? |
Devolve true se o Char for um caráter ASCII |
Char#whitespace? |
Devolve true se o Char for um caráter de espaço em branco |
Como um Char é um ponto Unicode de 32 bits, podes converter entre Chars e pontos de código (Int).
Isto pode ser feito com o método Char#ord, que devolve o ponto de código do Char, ou com o método Int#chr, que devolve o Char do ponto de código.
'a'.ord
# => 97
97.chr
# => 'a'
Tal como acontece com outros tipos de dados, os Chars têm alguns métodos para converter entre tipos.
O mais comum é o método Char#to_s, que converte o Char numa String. No entanto, existe também o método Char#to_i, que converte o Char num Int, e o método Char#to_f, que converte o Char num Float.
'a'.to_s
# => "a"
'4'.to_i
# => 4
'a'.to_i
# => Error: Invalid integer: a (ArgumentError)
A biblioteca de Luton é uma grande biblioteca com uma vasta coleção de literatura, que vai de livros a arte. A biblioteca tem uma secção onde se estuda literatura e se registam livros no sistema informático.
Algumas partes pretendem ser automatizadas e pedem-te ajuda. Isto inclui desde automatizar os formulários do processo de inscrição até ajudar a desencriptar textos.
Os livros de uma biblioteca devem ser fáceis de encontrar, por isso são ordenados pela primeira letra do título.
Implementa o método Library.first_letter, que recebe um argumento title, que contém o título do livro.
O método deve devolver a primeira letra do título.
Library.first_letter("Mystery of the Crystal Skull")
# => 'M'
A biblioteca tem muitos livros escritos por autores diferentes.
Frequentemente, os autores são referidos pelas suas iniciais, por isso a biblioteca pediu um sistema que devolva as iniciais do autor a partir do seu primeiro e último nome.
As iniciais devem ser formatadas assim: {first_letter_of_first_name}.{first_letter_of_last_name}
Implementa o método Library.initials, que recebe dois argumentos, first_name e last_name, que contêm o primeiro e o último nome do autor.
O método deve devolver as iniciais do autor.
Library.initials("William", "Shakespeare")
# => "W.S"
Parte da literatura está encriptada e a biblioteca tem muitos textos encriptados. A biblioteca gostaria de um novo sistema de desencriptação para uma encriptação especial.
A encriptação funciona tomando a letra e substituindo-a pela letra que a precede no alfabeto.
Por exemplo, a passa a z, b passa a a, c passa a b, e assim sucessivamente.
A biblioteca gostaria que o sistema conseguisse desencriptar tanto letras maiúsculas como minúsculas, mantendo cada letra no mesmo formato da letra original.
Implementa o método Library.decrypt_character, que recebe um argumento character, que contém a letra a desencriptar.
O método deve devolver a letra desencriptada.
Library.decrypt_character('a')
# => 'z'
A biblioteca também gostaria de desencriptar um texto inteiro encriptado com este método, que usa a letra anterior no alfabeto.
O desencriptador deve desencriptar apenas letras e deixar todos os outros carateres como estão.
Implementa o método Library.decrypt_text, que recebe um argumento text, que contém o texto a desencriptar.
O método deve devolver o texto desencriptado.
Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.