Char es un tipo de datos en Crystal que representa un punto de código Unicode de 32 bits.
Su tamaño los hace eficientes en memoria y les da propiedades específicas que String no tiene.
Se crean usando comillas simples (') y solo permiten colocar un único punto de código Unicode dentro.
'a' # => 'a'
'a'.class # => Char
Es bastante común trabajar con Char cuando se trabaja con String en Crystal, ya que varios métodos de la clase String devuelven Char o aceptan Char como argumentos.
Por ejemplo, el método String#[] devuelve un Char, o el método String#chars devuelve una colección de Char.
Debido a que un Char es un punto de código Unicode de 32 bits, admite incremento y decremento; esto hace que si tienes 'a', puedas obtener 'b' sumando uno.
'a' + 5
# => 'f'
'z' - 25
# => 'a'
También existe un método llamado Char#succ, que devuelve el siguiente carácter en la tabla Unicode, y Char#pred, que devuelve el carácter anterior en la tabla Unicode.
'a'.succ
# => 'b'
'z'.pred
# => 'y'
Dado que Char solo está pensado para representar un punto de código Unicode de 32 bits, no se pueden concatenar dos Char. Por lo tanto, Char solo se puede concatenar con String.
'a' + "bc"
# => "abc"
'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char
Crystal tiene algunos métodos para obtener información sobre un carácter, como si es un número o una letra, o si está en mayúscula o minúscula. Aquí tienes una lista de algunos de los métodos; para ver la lista completa, consulta la API de Char:
| Método | Descripción |
|---|---|
Char#number? |
Devuelve true si el Char es un número |
Char#letter? |
Devuelve true si el Char es una letra |
Char#lowercase? |
Devuelve true si el Char está en minúscula |
Char#uppercase? |
Devuelve true si el Char está en mayúscula |
Char#ascii? |
Devuelve true si el Char es un carácter ASCII |
Char#whitespace? |
Devuelve true si el Char es un carácter de espacio en blanco |
Dado que Char es un punto de código Unicode de 32 bits, puedes convertir entre Char y puntos de código (Int).
Esto se puede hacer con el método Char#ord, que devuelve el punto de código del Char, o con el método Int#chr, que devuelve el Char del punto de código.
'a'.ord
# => 97
97.chr
# => 'a'
Al igual que con otros tipos de datos, Char tiene algunos métodos para convertir entre tipos.
El más común es el método Char#to_s, que convierte el Char en un String. Sin embargo, también están el método Char#to_i, que convierte el Char en un Int, y el método Char#to_f, que convierte el Char en un Float.
'a'.to_s
# => "a"
'4'.to_i
# => 4
'a'.to_i
# => Error: Invalid integer: a (ArgumentError)
La biblioteca de Luton es una biblioteca grande con una gran colección de literatura, que va desde libros hasta arte. La biblioteca tiene una sección donde se estudia literatura y se agregan libros al sistema informático.
Ciertas partes buscan automatizarse y te piden que les ayudes. Esto incluye desde automatizar los formularios del proceso de inscripción hasta ayudar a descifrar textos.
Se supone que los libros de una biblioteca deben ser fáciles de encontrar, así que se ordenan por la primera letra del título.
Implementa el método Library.first_letter, que recibe un argumento title, el cual contiene el título del libro.
El método debe devolver la primera letra del título.
Library.first_letter("Mystery of the Crystal Skull")
# => 'M'
La biblioteca tiene muchos libros escritos por autores diferentes.
A los autores se les suele mencionar por sus iniciales, así que la biblioteca pidió un sistema que genere las iniciales del autor al ingresar el nombre y el apellido del autor.
Las iniciales deben tener el siguiente formato: {first_letter_of_first_name}.{first_letter_of_last_name}
Implementa el método Library.initials, que recibe dos argumentos, first_name y last_name, los cuales contienen el nombre y el apellido del autor.
El método debe devolver las iniciales del autor.
Library.initials("William", "Shakespeare")
# => "W.S"
Parte de la literatura está cifrada y la biblioteca tiene muchos textos cifrados. A la biblioteca le gustaría tener un nuevo sistema de descifrado para un cifrado especial.
El cifrado funciona tomando la letra y reemplazándola por la letra que la precede en el alfabeto.
Por ejemplo, a se convierte en z, b se convierte en a, c se convierte en b, y así sucesivamente.
A la biblioteca le gustaría que pueda descifrar tanto letras mayúsculas como minúsculas y que conserve el mismo uso de mayúsculas y minúsculas que la letra original.
Implementa el método Library.decrypt_character, que recibe un argumento character, el cual contiene la letra que se va a descifrar.
El método debe devolver la letra descifrada.
Library.decrypt_character('a')
# => 'z'
A la biblioteca también le gustaría poder descifrar un texto completo con este cifrado, que reemplaza cada letra por la que la precede en el alfabeto.
El descifrador solo debe descifrar letras y dejar todos los demás caracteres tal como están.
Implementa el método Library.decrypt_text, que recibe un argumento text, el cual contiene el texto que se va a descifrar.
El método debe devolver el texto descifrado.
Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.