Масив у Gleam - це незмінна колекція з нуля або більше значень. Усі значення в масиві мусять мати той самий тип. Оскільки масиви незмінні, то щойно масив створено, його значення вже не може змінитися. Будь-які функції чи оператори, які нібито змінюють масив (наприклад, додають елемент), насправді повертають новий масив.
Масиви можна визначити так:
let empty = []
let singleValue = [5]
let threeValues = ["a", "b", "c"]
Найпоширеніший спосіб додати елемент до масиву - скористатися синтаксисом розгортання:
let two_to_four = [2, 3, 4]
let one_to_four = [1, ..two_to_four]
// -> [1, 2, 3, 4]
Модуль gleam/list зі стандартної бібліотеки Gleam містить багато корисних функцій для роботи з масивами. Цей модуль дуже часто використовують у коді Gleam, тож варто з ним ознайомитися.
Шаблони масивів можна використовувати у виразах case, щоб зіставляти масиви та присвоювати змінним значення, які в них містяться:
pub fn describe(list: List(String)) -> String {
case list {
[] -> "Empty list"
[x] -> "List with one item: " <> x
[x, y] -> "List with two items: " <> x <> " and " <> y
_ -> "List with three or more items"
}
}
Крім зіставлення з масивами точної довжини, синтаксис розгортання дає змогу зіставляти масиви довжиною щонайменше певного розміру:
pub fn describe(list: List(String)) -> String {
case list {
[_, _, ..] -> "List with at least two items"
[_] -> "List with one item"
[] -> "Empty list"
}
}
Синтаксис розгортання також дає змогу присвоїти решту масиву змінній:
pub fn remove_first_item(list: List(String)) -> List(String) {
case list {
// Return the list without the first item
[_, ..rest] -> rest
// There's no first item to remove, return an empty list
_ -> []
}
}
Вирази case повинні мати шаблон для кожного можливого значення типу, з яким зіставляють, тож останній шаблон ігнорування (_) часто використовують, щоб обробити всі решта значень.
У цій вправі ми будемо писати код, щоб відстежувати масив мов програмування, які хочемо вивчати на Exercism.
На нас чекає шість завдань, і всі вони повʼязані з роботою з масивами.
Щоб відстежувати мови, які ми хочемо вивчати, нам потрібно створити новий масив. Визначмо функцію new_list, яка повертає новий порожній масив.
new_list()
// -> []
Зараз у нас є аркуш паперу з переліком мов, які ми хочемо вивчати: Gleam, Go і TypeScript. Визначмо функцію existing_list, яка повертає цей масив.
existing_list()
// -> ["Gleam", "Go", "TypeScript"]
Досліджуючи Exercism і знаходячи цікавіші мови, ми хочемо додавати їх до свого масиву. Реалізуймо функцію add_language, щоб додавати нову мову на початок масиву.
add_language(["OCaml", "Elixir"], "Scheme")
// -> ["Scheme", "OCaml", "Elixir"]
Рахувати мови по одній незручно. Реалізуймо функцію count_languages, щоб порахувати кількість мов у масиві.
count_languages(["jq", "Elm", "Rust", "Kotlin"])
// -> 4
У якийсь момент ми усвідомлюємо, що наш масив насправді впорядковано у зворотному порядку! Реалізуймо функцію reverse_list, щоб перевернути масив.
reverse_list(["Python", "Julia", "Idris", "COBOL"])
// -> ["COBOL", "Idris", "Julia", "Python"]
Хоча ми любимо всі мови, Gleam посідає особливе місце в нашому серці. Тому масив мов викликає в нас справжнє захоплення, якщо:
Реалізуймо функцію exciting_list, щоб перевірити, чи масив мов захопливий:
exciting_list(["Lua", "Gleam"])
// -> True
Зареєструйтеся на Exercism, щоб вивчати й опановувати Gleam, а також 33 концепції122 вправи та справжнє наставництво від людей, і все це безкоштовно.