Основна бібліотека Cairo реалізує тип Array.
Він схожий на звичайні типи масивів в інших мовах програмування, але має кілька ключових відмінностей:
Array, а ефективно видаляти лише з початку.Масиви можна створювати за допомогою функції ArrayTrait::new, а також макросу array!:
let empty: Array<u32> = ArrayTrait::new();
let one_to_four = array![1, 2, 3, 4];
Елементи можна додавати до масиву за допомогою функції ArrayTrait::append:
let mut num_array = array![1, 2, 3, 4];
num_array.append(5);
// -> [1, 2, 3, 4, 5]
Елементи можна видаляти з масиву за допомогою функції ArrayTrait::pop_front:
let mut one_to_four = array![1, 2, 3, 4];
one_to_four.pop_front();
// -> [2, 3, 4]
Крім того, Cairo вводить тип Span, який поводиться як «знімок» Array.
Кожен Array можна перетворити на Span за допомогою функції ToSpanTrait::span:
let one_to_four = array![1, 2, 3, 4];
let one_to_four_span = one_to_four.span();
// -> [1, 2, 3, 4]
Перетворення масиву на Span дуже ефективне, адже Span - це просто структура даних, яка дозволяє Cairo «переглядати» частину масиву й жодним чином його не змінює.
Перетворивши масив на Span, Cairo дозволяє виконувати більше операцій, ніж було б дозволено безпосередньо над Array, наприклад видаляти елемент з початку Span:
let one_to_four = array![1, 2, 3, 4];
let mut one_to_four_span = one_to_four.span();
one_to_four_span.pop_back();
// -> [2, 3, 4]
Варто зауважити, що нам довелося зробити one_to_four_span змінним за допомогою ключового слова mut, щоб викликати pop_back, який змінює Span, скорочуючи ту частину масиву, яку Span «переглядає».
Як майбутня чарівниця, Еліз має попрактикуватися в основах.
У неї є стос карт, з якими вона хоче працювати.
Щоб трохи спростити собі завдання, вона використовує лише карти від 1 до 10.
Стос карт представлено Array, де низ стосу розташований на початку масиву, а верх - у кінці.
Реалізуйте функцію insert_top, яка повертає копію стосу з новою наданою картою, доданою на верх стосу.
let stack = array![5, 9, 7, 1];
insert_top(stack, 8);
// -> [5, 9, 7, 1, 8]
Реалізуйте функцію remove_top_card, яка повертає копію стосу з прибраною верхньою картою.
Якщо наданий стос порожній, слід повернути початковий стос без змін.
let stack = array![3, 2, 6, 4, 8];
remove_top_card(stack);
// -> [3, 2, 6, 4]
Реалізуйте функцію insert_bottom, яка повертає копію стосу з новою наданою картою, доданою в низ стосу.
let stack = array![5, 9, 7, 1];
insert_bottom(stack, 8);
// -> [8, 5, 9, 7, 1]
Реалізуйте функцію remove_bottom_card, яка повертає копію стосу з прибраною нижньою картою.
Якщо наданий стос порожній, слід повернути початковий стос без змін.
let stack = array![8, 5, 9, 7, 1];
remove_bottom_card(stack);
// -> [5, 9, 7, 1]
Реалізуйте функцію check_size_of_stack, яка перевіряє, чи дорівнює розмір стосу наданому stack_size, чи ні.
let stack = array![3, 2, 6, 4, 8];
check_size_of_stack(stack, 4);
// -> false
Щоб зрозуміти, чому працювати з масивами в Cairo не так просто, як в інших мовах програмування, варто памʼятати, що Cairo використовує незмінну модель памʼяті: щойно в комірку памʼяті щось записано, її вже не можна перезаписати, можна лише читати з неї.
Мова дещо приховує цю особливість, дозволяючи розробникам оголошувати та використовувати свої змінні так, ніби вони можуть змінюватися.
Хоча це трохи ускладнює написання коду, особливо коду, який використовує тип Array (зокрема ByteArray, який насправді є «масивом байтів»), це дає змогу писати доводжувані програми, які можна впевнено виконувати навіть на ненадійних машинах, тож компроміс цілком того вартий.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Cairo, а також 25 концепцій68 вправ та справжнє наставництво від людей, і все це безкоштовно.