Масив - це змінна структура даних, яка зберігає набір елементів певного типу. Масив - це індексована структура даних. Те, що масиви змінні, означає: якщо викликати метод масиву, який його змінює, масив буде змінено. Тобто метод не створює новий масив, а змінює наявний.
Щоб створити масив, використайте синтаксис літерала масиву ([]) і вкажіть усередині елементи масиву, розділені комою.
[1, 2, 3] # => [1, 2, 3]
Crystal визначить тип масиву за його елементами.
[1, 2, 3].class # => Array(Int32)
Хоча раніше ми згадували, що масив - це набір елементів певного типу, можна створити масив із кількома типами за допомогою обʼєднаних типів. Це дозволяє масиву містити елементи будь-якого з типів, зазначених в обʼєднаному типі. Crystal визначить тип масиву за його елементами.
[1, "2", 3.0] # => [1, "2", 3.0]
[1, "2", 3.0].class # => Array(Int32 | Float64 | String)
Багатовимірний масив - це масив масивів.
Тобто кожен елемент такого масиву сам є масивом.
Це може стати в пригоді, коли потрібно зберегти дані у вигляді таблиці.
Щоб визначити багатовимірний масив, можна або записати літерал масиву масивів, або скористатися конструктором Array.new.
[[1, 2], [3, 4]] # => [[1, 2], [3, 4]]
numbers = Array(Array(Int32)).new() # => []
numbers << [1, 2] # => [[1, 2]]
Щоб додати елемент до масиву, використайте оператор << (додавання в кінець).
[1, 2, 3] << 4 # => [1, 2, 3, 4]
Тип елемента, який ми додаємо, має збігатися з типом масиву; якщо це не так, буде викликано помилку.
numbers : Array(Int32 | Float64) = [1, 2, 3]
numbers << 4.0
numbers # => [1, 2, 3, 4.0]
numbers << "5" # => Error: no overload matches 'Array(Int32 | Float64)#<<' with type String
Як і з String, розмір масиву можна отримати за допомогою методу size.
[1, 2, 3].size # => 3
Компілятор не може визначити тип масиву, коли ми створюємо порожній масив.
Тому тип масиву потрібно вказати.
Це можна зробити, вказавши тип масиву за допомогою ключового слова of, або скориставшись синтаксисом ініціалізації масиву Array(T).new.
[] of (Int32 | Float64 | String) # => []
Array(Int32 | Float64 | String).new # => []
Як і з String, до елементів масиву можна звертатися за допомогою оператора [] (індексація), передавши йому індекс потрібного елемента.
Якщо індекс виходить за межі, буде викликано IndexError.
[1, 2, 3][0] # => 1
[1, 2, 3][3] # => Index out of bounds (IndexError)
Також до елементів можна звертатися за допомогою діапазону.
[1, 2, 3][0..1] # => [1, 2]
Щоб створити масив із діапазону, використайте метод to_a.
Це стане в пригоді, коли потрібно створити масив чисел.
(1..3).to_a # => [1, 2, 3]
Щоб створити масив із рядка тексту (англ. string), використайте метод split.
Він дозволяє розбити рядок тексту на масив рядків тексту за допомогою роздільника.
"1,2,3".split(",") # => ["1", "2", "3"]
Також із рядка тексту можна отримати масив символів за допомогою методу chars.
"123".chars # => ['1', '2', '3']
Щоб перетворити масив Char або String на String, можна скористатися методом join, який приймає роздільник як аргумент.
['1', '2', '3'].join(".") # => "1.2.3"
Коли потрібно видалити елемент із кінця масиву, можна скористатися методом pop, який приймає необовʼязковий аргумент: скільки елементів видалити з кінця масиву.
Метод повертає видалений елемент.
Якщо масив порожній, буде викликано IndexError.
numbers = [1, 2, 3]
numbers.pop # => 3
numbers # => [1, 2]
empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)
Коли потрібно видалити елемент із певним індексом, можна скористатися методом delete_at, який приймає індекс елемента для видалення як аргумент.
Якщо масив порожній, буде викликано IndexError.
numbers = [1, 2, 3]
numbers.delete_at(1) # => 2
numbers # => [1, 3]
empty_numbers = [] of Int32
empty_numbers.delete_at(0) # => Index out of bounds (IndexError)
Коли потрібно змінити елемент із певним індексом, можна скористатися оператором []= (присвоєння за індексом), який приймає індекс елемента для зміни та нове значення як аргументи.
Якщо індекс виходить за межі, буде викликано IndexError.
numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]
numbers[3] = 5 # => Index out of bounds (IndexError)
У цій вправі нам потрібно реалізувати кілька методів для роботи з масивом мов програмування.
Визначте метод LanguageList.list, який не приймає аргументів і повертає порожній масив типу Array(String).
LanguageList.list()
# => []
Визначте метод LanguageList.add, який приймає 2 аргументи (масив мов і літерал рядка тексту (англ. string) з назвою мови).
Метод має повернути масив із новою мовою, доданою в кінець масиву.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
Визначте метод LanguageList.remove, який приймає 1 аргумент (масив мов).
Метод має повернути масив без останнього елемента.
Вважайте, що в масиві завжди буде принаймні один елемент.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
language_list = LanguageList.remove(language_list)
# => ["Crystal"]
Визначте функцію LanguageList.at, яка приймає 2 аргументи (масив мов і індекс).
Метод має повернути мову за індексом n у масиві.
Вважайте, що за цим індексом завжди буде мова.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
LanguageList.at(language_list, 1)
# => "Ruby"
Визначте метод LanguageList.parse, який приймає 1 аргумент (літерал рядка тексту з мовами, розділеними комою).
Метод має повернути масив мов.
LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.