Коли варіант власного типу містить дані, він називається записом, а кожне значення в ньому міститься в полі.
pub type Rectangle {
Rectangle(
Float, // The first field
Float, // The second field
)
}
Щоб полегшити читання, Gleam дозволяє позначати поля іменем.
pub type Rectangle {
Rectangle(
width: Float,
height: Float,
)
}
Мітки можна використовувати, щоб передавати аргументи конструктору запису в будь-якому порядку.
let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)
a == b
// -> True
Коли власний тип має лише один варіант, тоді синтаксис доступу .label можна використовувати, щоб отримати поля запису.
let rect = Rectangle(height: 10.0, width: 20.0)
rect.height // -> 10.0
rect.width // -> 20.0
Синтаксис оновлення запису можна використовувати, коли власний тип має єдиний варіант, щоб створити новий запис із наявного, але з деякими полями, заміненими на нові значення.
let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)
tall_rect.height // -> 50.0
tall_rect.width // -> 20.0
Мітки також можна використовувати під час зіставлення зі зразком, щоб витягти значення із записів.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, width: _) if h >. 20.0 -> True
_ -> False
}
}
Якщо ми хочемо зіставити лише деякі поля, можемо використати оператор розгортання .., щоб ігнорувати решту полів.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, ..) if h >. 20.0 -> True
_ -> False
}
}
У цій вправі ми великі фанати спорту й щойно відкрили в собі пристрасть до баскетболу НБА. Оскільки ми новачки в баскетболі НБА, ми глибоко занурюємося в історію НБА, відстежуємо команди, тренерів, їхню статистику перемог і поразок та порівнюємо їх між собою.
Оскільки в нас ще немає улюбленої команди, ми також розробимо алгоритм, який визначатиме, чи варто вболівати за ту чи іншу команду.
На нас чекають сім завдань, які допоможуть розробити власний алгоритм вболівання за команду.
Визначмо запис Coach із такими двома полями:
name: імʼя тренера, типу String.former_player: указує, чи був тренер колишнім гравцем, типу Bool.Визначмо запис Stats із такими двома полями:
wins: кількість перемог, типу Int.losses: кількість поразок, типу Int.Визначмо запис Team із такими трьома полями:
name: назва команди, типу String.coach: тренер команди, типу Coach.stats: статистика команди, типу Stats.Реалізуймо функцію create_coach, яка приймає імʼя тренера та його статус колишнього гравця як параметри й повертає запис Coach:
create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)
Реалізуймо функцію create_stats, яка приймає кількість перемог і кількість поразок як параметри й повертає запис Stats:
create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)
Реалізуймо функцію create_team, яка приймає назву команди, тренера та запис зі статистикою як параметри й повертає запис Team:
let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Larry Bird", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
Власники клубів НБА нетерплячі, тож ми помітили, що погані результати команди часто призводять до заміни тренера. Реалізуймо функцію replace_coach, яка приймає команду та її нового тренера як параметри й повертає команду, але вже з новим тренером:
let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)
let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
Порпаючись у статистиці, ми ведемо списки команд та їхню статистику. Іноді ми помиляємося, і в списку трапляються дублікати. Реалізуймо функцію is_same_team, яка приймає дві команди й повертає True, якщо це та сама команда, інакше повертає False:
let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)
let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)
is_same_team(pacers_team, lakers_team)
// -> False
Передивившись багато команд і матчів, ми вигадали алгоритм. Якщо виконується хоча б одна з наведених умов, ми вболіваємо за цю команду:
Реалізуймо функцію root_for_team, яка приймає команду й повертає True, якщо за цю команду варто вболівати, інакше повертає False:
let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
Зареєструйтеся на Exercism, щоб вивчати й опановувати Gleam, а також 33 концепції122 вправи та справжнє наставництво від людей, і все це безкоштовно.