У Cairo немає вбудованого типу для рядків тексту (англ. string), але є два способи працювати з ними: короткі рядки в одинарних лапках і ByteArray у подвійних.
Короткий рядок - це ASCII-рядок, у якому кожен символ закодовано одним байтом.
Тип, який Cairo типово використовує для коротких рядків, - це felt252, тож їхня максимальна довжина становить лише 31 символ.
// below are different ways to write the same value
let name: felt252 = 'Jane'; // short string format
let name: felt252 = 0x4a616e65; // byte format
let name: felt252 = 1247899237; // decimal format
Формально кажучи, будь-який цілий тип, менший за felt252, можна подати у форматі короткого рядка.
// all of the below are equal u8 values, they are just written using different formats!
let lowercase_a_in_ascii: u8 = 'a'; // short string format
let lowercase_a_in_ascii: u8 = 0x61; // byte format
let lowercase_a_in_ascii: u8 = 97; // decimal format
Для рядків, довших за 31 символ, Cairo надає ByteArray, довжина якого необмежена.
let long_string: ByteArray = "this is a string which has more than 31 characters";
ByteArray можна зʼєднувати за допомогою оператора +:
"Jane" + " " + "Austen"
// => "Jane Austen"
Деякі спеціальні символи потрібно екранувати за допомогою зворотної скісної риски, наприклад \t для символу табуляції та \n для переходу на новий рядок.
"How is the weather today?\nIt's sunny"
// =>
// How is the weather today?
// It's sunny
Можна навіть отримати доступ до окремих байтів усередині ByteArray за його індексом.
Але будьмо уважні: тип поверненого байта - це u8, а не ByteArray!
let hello: ByteArray = "Hello World!";
let exclamation_mark: u8 = hello[11];
// => 33
Основна бібліотека надає багато корисних методів і операторів для роботи з ByteArray.
Щоб дізнатися більше про методи ByteArray, перегляньте документацію ByteArrayTrait.
Ось кілька прикладів:
let name: felt252 = 'Jane';
let mut greeting: ByteArray = "Welcome ";
// append_word appends a single word of a given number of bytes to the end of the ByteArray
greeting.append_word(name, 4);
// => "Welcome Jane"
// rev returns a ByteArray with the all characters reversed
let rev_greeting = greeting.rev();
// => "enaJ emocleW"
Недалеко є магазин побутової техніки під назвою «Tech Palace». Власник магазину нещодавно встановив великий дисплей, щоб показувати рекламні повідомлення та особливе вітання, коли покупці сканують свої картки лояльності біля входу. Дисплей складається з безлічі дрібних світлодіодів і може показувати кілька рядків тексту.
Власникові магазину потрібна наша допомога з кодом, який генерує текст для нового дисплея.
Для більшості покупців, які сканують свої картки лояльності, власник хоче бачити на дисплеї Welcome to the Tech Palace, , за яким іде імʼя покупця великими літерами.
Реалізуйте функцію welcome_message, яка приймає імʼя покупця як короткий рядок тексту (англ. string) в аргументі типу felt252 і повертає потрібне повідомлення як ByteArray.
welcome_message("Judy")
// => Welcome to the Tech Palace, JUDY
Для постійних покупців, які багато купують у магазині, власник хоче зробити вітальне повідомлення на дисплеї більш ошатним, додавши рядок зірочок перед вітальним повідомленням і після нього. Він ще не визначив, скільки зірочок має бути в рядках, тому хоче, щоб це можна було налаштувати.
Напишіть функцію add_border, яка приймає вітальне повідомлення (типу ByteArray) і кількість зірочок у рядку (тип u32) як аргументи.
Вона має повернути ByteArray, що складається з 3 рядків: рядка з потрібною кількістю зірочок, потім вітального повідомлення в тому вигляді, у якому його передали, і ще одного рядка зірочок.
add_border("Welcome!", 10)
Має повернути таке:
**********
Welcome!
**********
Перед встановленням цього нового дисплея в магазині був схожий дисплей, який міг показувати лише статичні рядки, які не можна було налаштувати. Власник хотів би використати частину старих рекламних повідомлень на новому дисплеї. Однак у цих даних уже є рамка із зірочок і деякі небажані пробільні символи. Наше завдання - прибрати все зайве з повідомлень, щоб їх можна було використати знову.
Реалізуйте функцію clean_up_message, яка приймає старе рекламне повідомлення як ByteArray.
Спочатку функція має прибрати з тексту всі зірочки, а потім прибрати пробільні символи на початку й у кінці того, що залишилося.
Після цього функція має повернути очищене повідомлення.
let message: ByteArray = "
**************************
* BUY NOW, SAVE 10% *
**************************
";
clean_up_message(message)
// => BUY NOW, SAVE 10%
Зареєструйтеся на Exercism, щоб вивчати й опановувати Cairo, а також 25 концепцій68 вправ та справжнє наставництво від людей, і все це безкоштовно.