У Crystal є тип String, який використовують для представлення тексту.
Рядки тексту (англ. string) у Crystal - це послідовності символів Unicode.
Рядки тексту незмінні: після створення їх уже не можна змінити.
Тому щоразу, коли ми змінюємо рядок тексту, створюється новий рядок, а початковий залишається без змін.
Щоб визначити рядок тексту, використовують подвійні лапки ".
"Hello World"
Щоб зʼєднати два рядки тексту, використаймо оператор +.
Оператор + повертає новий рядок тексту, який поєднує ці два рядки.
hello = "Hello"
hello + " World"
# => "Hello World"
Метод to_i перетворює рядок тексту на ціле число.
Натомість метод to_f повертає число з плаваючою комою.
Якщо рядок тексту не вдається перетворити на число, буде викликано помилку ArgumentError.
"1".to_i
# => 1
"1.0".to_f
# => 1.0
"Hello".to_i
# => ArgumentError: Invalid integer: Hello
Ціле число або число з плаваючою комою можна перетворити на рядок тексту методом to_s.
1.to_s
# => "1"
1.0.to_s
# => "1.0"
Інтерполяція - це зручний спосіб поєднувати рядки тексту й вбудовувати вирази в рядки.
Щоб інтерполювати рядок тексту, використаймо символ #, за яким ідуть фігурні дужки {} із виразом усередині.
name = "World"
"Hello #{name}!"
# => "Hello World!"
Crystal автоматично перетворить результат виразу на рядок тексту.
"Hello #{1 + 1}!"
# => "Hello 2!"
Коли потрібно дізнатися кількість символів у рядку тексту, скористаймося методом size, який повертає довжину рядка як ціле число.
Розмір рядка тексту зберігається як властивість цього рядка, тож його не потрібно обчислювати щоразу при виклику методу, завдяки чому метод працює дуже швидко.
"Hello World".size
# => 11
Індексація потрібна, коли ми хочемо дістати конкретний символ із рядка тексту.
Щоб дістати символ із String, можна скористатися звичним записом у квадратних дужках.
[] реалізовано як метод екземпляра String, де індекс є аргументом методу.
Перший символ у рядку тексту в Crystal має індекс 0.
"Hello World"[0]
# => 'H'
"Hello World"[6]
# => 'W'
Щоб дістати символ із кінця рядка тексту, можна взяти довжину рядка мінус один, і це буде індекс останнього символу; для передостаннього символу - довжину мінус два, і так далі. Є й коротший шлях: скористатися відʼємним індексом, де останній символ має індекс -1, передостанній - індекс -2, і так далі.
name = "Hello World"
name[name.size - 1]
# => 'd'
name[-1]
# => 'd'
Деякі символи не можна записати в рядку тексту безпосередньо, для них потрібна керуюча послідовність.
Наприклад, щоб ужити подвійні лапки всередині рядка тексту, їх потрібно екранувати.
Керуючу послідовність записують за допомогою символу \, за яким іде символ, який потрібно екранувати.
Ось спеціальні символи в Crystal:
| Значення | Опис |
|---|---|
\a |
Сигнал |
\b |
Крок назад |
\e |
Керуючий символ |
\f |
Подача сторінки |
\n |
Переведення рядка або новий рядок |
\r |
Повернення каретки |
\t |
Горизонтальна табуляція |
\v |
Вертикальна табуляція |
\\ |
Зворотна коса риска |
\' |
Одинарні лапки |
\" |
Подвійні лапки |
\377 |
Вісімковий символ ASCII |
\xFF |
Шістнадцятковий символ ASCII |
\uFFFF |
Шістнадцятковий символ Unicode |
puts "Hello \"World\""
# => Hello "World"
puts "Hello \nWorld"
# => Hello
# => World
Щоб записати багаторядковий рядок тексту, використовують той самий синтаксис, що й для однорядкового, але кожен рядок вмісту переносять на новий рядок.
"Hello
World"
# => "Hello\nWorld"
Жив собі ексцентричний програміст у дивному будинку з ґратами на вікнах. Одного дня він узяв на онлайн-біржі праці замовлення: створити робота для вечірок. Робот має вітати людей і проводжати їх до їхніх місць. Перша версія була дуже технічною і виказувала брак навичок спілкування в програміста. Дещо з цього також перейшло в наступну версію.
Реалізуймо метод welcome, який повертає вітальне повідомлення з переданим імʼям:
PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!
Реалізуймо метод happy_birthday, який повертає привітання з днем народження, використовуючи передане імʼя та вік людини.
На жаль, програміст трохи хвалькуватий, тож роботу доводиться демонструвати, що він знає день народження кожного гостя.
PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!
Реалізуймо функцію assign_table, яка вказує напрямок.
Вона має приймати 5 параметрів.
String)Int)String)String)Float64)Точний формат результату видно в прикладі нижче.
Імʼя сусіда потрібно скоротити до першої та останньої літери. Frank стає Fk, Christian стає Cn і так далі.
Робот називає номер столика. Робот також згадує відстань до столика. На щастя, лише з точністю до однієї цифри.
PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.