Char - це тип даних у Crystal, що представляє 32-бітну кодову точку Unicode.
Його розмір робить його економним щодо памʼяті та надає йому особливих властивостей, яких не мають рядки тексту (англ. string).
Такі значення створюють за допомогою одинарних лапок ('), і всередину можна помістити лише одну кодову точку Unicode.
'a' # => 'a'
'a'.class # => Char
У Crystal досить часто доводиться працювати з Char, коли ми працюємо з рядками тексту, адже чимало методів класу String повертають Char або приймають Char як аргументи.
Наприклад, метод String#[] повертає Char, а метод String#chars повертає колекцію Char.
Оскільки Char є 32-бітною кодовою точкою Unicode, він підтримує інкремент і декремент: якщо у нас є 'a', то, додавши одиницю, ми отримаємо 'b'.
'a' + 5
# => 'f'
'z' - 25
# => 'a'
Також є метод Char#succ, який повертає наступний символ у таблиці Unicode, і Char#pred, який повертає попередній символ у таблиці Unicode.
'a'.succ
# => 'b'
'z'.pred
# => 'y'
Оскільки Char призначений лише для представлення 32-бітної кодової точки Unicode, два символи не можна конкатенувати.
Тому Char можна конкатенувати лише з рядками тексту.
'a' + "bc"
# => "abc"
'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char
У Crystal є кілька методів, які дають змогу дізнатися більше про символ: наприклад, чи є він числом або літерою, чи написаний у верхньому чи нижньому регістрі. Ось список деяких із цих методів; повний список дивіться в API Char:
| Метод | Опис |
|---|---|
Char#number? |
Повертає true, якщо символ є числом |
Char#letter? |
Повертає true, якщо символ є літерою |
Char#lowercase? |
Повертає true, якщо символ у нижньому регістрі |
Char#uppercase? |
Повертає true, якщо символ у верхньому регістрі |
Char#ascii? |
Повертає true, якщо символ належить до ASCII |
Char#whitespace? |
Повертає true, якщо символ є пробільним |
Char
Оскільки Char представляє 32-бітну кодову точку Unicode, ми можемо перетворювати Char у кодові точки (Int) і навпаки.
Для цього використовують метод Char#ord, який повертає кодову точку символу, або метод Int#chr, який повертає символ за його кодовою точкою.
'a'.ord
# => 97
97.chr
# => 'a'
Як і в інших типів даних, у символів є кілька методів для перетворення між типами.
Найпоширеніший із них - метод Char#to_s, який перетворює символ у рядок тексту. Крім того, є метод Char#to_i, який перетворює символ у Int, і метод Char#to_f, який перетворює символ у Float.
'a'.to_s
# => "a"
'4'.to_i
# => 4
'a'.to_i
# => Error: Invalid integer: a (ArgumentError)
Бібліотека Лутона - велика бібліотека з великою колекцією літератури, від книжок до мистецтва. У бібліотеці є відділ, де вивчають літературу та додають книжки до компʼютерної системи.
Деякі частини мають бути автоматизовані, і нас просять допомогти. Це охоплює допомогу в усьому: від автоматизації форм процесу вписування до розшифрування текстів.
Книжки в бібліотеці мають бути легко знаходити, тому їх сортують за першою літерою назви.
Реалізуйте метод Library.first_letter, який приймає аргумент title, що містить назву книги.
Метод має повертати першу літеру назви.
Library.first_letter("Mystery of the Crystal Skull")
# => 'M'
У бібліотеці багато книжок, написаних різними авторами.
Авторів часто називають за ініціалами, тож бібліотека попросила систему, яка за введеними імʼям та прізвищем видає ініціали автора.
Ініціали мають бути відформатовані так: {first_letter_of_first_name}.{first_letter_of_last_name}
Реалізуйте метод Library.initials, який приймає два аргументи first_name і last_name, що містять імʼя та прізвище автора.
Метод має повертати ініціали автора.
Library.initials("William", "Shakespeare")
# => "W.S"
Деяка література зашифрована, і в бібліотеці багато зашифрованих текстів. Бібліотека хотіла б отримати нову систему розшифрування для особливого шифрування.
Шифрування працює так: беруть літеру й замінюють її на літеру, що стоїть перед нею в алфавіті.
Наприклад, a стає z, b стає a, c стає b і так далі.
Бібліотека хотіла б, щоб система могла розшифровувати як великі, так і малі літери й зберігати той самий регістр, що й у вихідної літери.
Реалізуйте метод Library.decrypt_character, який приймає аргумент character, що містить літеру для розшифрування.
Метод має повертати розшифровану літеру.
Library.decrypt_character('a')
# => 'z'
Бібліотека також хотіла б розшифровувати цілий текст за допомогою шифрування, яке бере попередню літеру в алфавіті.
Розшифрувальник має розшифровувати лише літери, а всі інші символи залишати без змін.
Реалізуйте метод Library.decrypt_text, який приймає аргумент text, що містить текст для розшифрування.
Метод має повертати розшифрований текст.
Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.