Char es un tipo de datos de 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 los String no tienen.
Se crean con comillas simples (') y solo permiten que se coloque dentro un único punto de código Unicode.
'a' # => 'a'
'a'.class # => Char
Es bastante habitual trabajar con Char cuando se trabaja con String en Crystal, ya que bastantes 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.
Como un Char es un punto de código Unicode de 32 bits, admite incrementos y decrementos, lo que 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 Char de la tabla Unicode, y Char#pred, que devuelve el Char anterior de la tabla Unicode.
'a'.succ
# => 'b'
'z'.pred
# => 'y'
Como un Char solo está pensado para representar un punto de código Unicode de 32 bits, no se pueden concatenar dos Char. Por lo tanto, los Char solo se pueden 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úsculas o en minúsculas. Aquí tienes una lista con algunos de esos 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úsculas |
Char#uppercase? |
Devuelve true si el Char está en mayúsculas |
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 |
Como un 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 correspondiente a ese punto de código.
'a'.ord
# => 97
97.chr
# => 'a'
Al igual que con otros tipos de datos, los Char tienen algunos métodos para convertir entre tipos.
El más habitual 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 gran biblioteca con una amplia colección de literatura, que abarca desde libros hasta arte. La biblioteca tiene una sección en la que se estudia literatura y se añaden libros al sistema informático.
Ciertas partes pretenden automatizarse y te han pedido que les ayudes. Esto incluye ayudar con cosas que van desde automatizar los formularios del proceso de inscripción hasta ayudar a descifrar textos.
Se supone que los libros de una biblioteca son fáciles de encontrar, por lo que se ordenan por la primera letra del título.
Implementa el método Library.first_letter, que recibe un argumento title, que 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 distintos autores.
A menudo se hace referencia a los autores por sus iniciales, así que la biblioteca pidió un sistema que proporcione las iniciales del autor introduciendo su nombre y su apellido.
Las iniciales deben tener este 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, que 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 contar con un nuevo sistema de descifrado para un cifrado especial.
El cifrado funciona tomando la letra y sustituyé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 fuese capaz de descifrar tanto letras mayúsculas como minúsculas y que conserve si son mayúsculas o minúsculas igual que la letra original.
Implementa el método Library.decrypt_character, que recibe un argumento character, que contiene la letra que hay que descifrar.
El método debe devolver la letra descifrada.
Library.decrypt_character('a')
# => 'z'
A la biblioteca también le gustaría descifrar un texto completo, con el cifrado que toma la letra anterior del alfabeto.
El descifrador solo debe descifrar letras y dejar todos los demás caracteres tal cual están.
Implementa el método Library.decrypt_text, que recibe un argumento text, que contiene el texto que hay que 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.