Изучение Топаза

Данные и управление

Храните учебные задачи в записях и массиве, выбирайте метки через if и match и суммируйте оставшееся время.

Сохраните несколько учебных задач, выведите метку для каждой и сложите время незавершённых задач. Найдите значение по умолчанию для состояния задачи и проследите, как if и match выбирают вывод.

Сначала пройдите раздел Значения и функции. Вам снова понадобятся параметры, результаты функций и переменная с let mut для накопления суммы.

Сохраните и перечислите задачи

Сохраните код в файле data-control.tpz в своей рабочей папке.

TOPAZ
record УчебнаяЗадача {
    название: string,
    минуты: int,
    выполнена: bool = false,
}

function темп(задача: УчебнаяЗадача) -> string {
    if задача.выполнена {
        return "done"
    }
    match задача.минуты {
        case 1..15 => "quick"
        case 16..30 => "focused"
        case _ => "deep"
    }
}

let задачи: Array<УчебнаяЗадача> = [
    УчебнаяЗадача { название: "Run first program", минуты: 10, выполнена: true },
    УчебнаяЗадача { название: "Build application", минуты: 25 },
]
let mut осталось = 0
for задача in задачи {
    if !задача.выполнена {
        осталось = осталось + задача.минуты
    }
    print("{задача.название}: {темп(задача)}")
}
print("remaining: {осталось} minutes")

В той же папке проверьте и запустите файл.

BASH
topaz check data-control.tpz
topaz run data-control.tpz

Проверка завершается с кодом 0. Программа выводит задачи в порядке элементов массива, затем оставшееся время.

Вывод
Run first program: done
Build application: focused
remaining: 25 minutes

Найдите поля и значение по умолчанию

УчебнаяЗадача объединяет название, длительность и состояние выполнения в одну запись. Каждая именованная часть называется полем. Объявление создаёт отдельный тип УчебнаяЗадача.

Поле выполнена по умолчанию равно false. Во второй задаче оно пропущено, поэтому задача считается незавершённой. В первой задано выполнена: true, поэтому она завершена.

Array<УчебнаяЗадача> хранит две задачи по порядку. Каждый элемент имеет тип УчебнаяЗадача. Цикл for перебирает их в этом порядке, используя имя задача для текущего элемента.

Проследите путь от if и match до вывода

В цикле if !задача.выполнена прибавляет длительность незавершённой задачи к осталось. Знак ! меняет логическое значение на противоположное. Первая задача ничего не добавляет, а вторая добавляет 25.

В функции темп условие if задача.выполнена возвращает "done" для первой задачи. Этот return завершает функцию до match. Вторая задача доходит до match, который сравнивает её длительность с вариантами по порядку.

Длительность незавершённой задачиПодходящий вариантВозвращаемая метка
От 1 до 15 включительноcase 1..15"quick"
От 16 до 30 включительноcase 16..30"focused"
Любое другое целое числоcase _"deep"

Вторая задача занимает 25 минут, поэтому темп возвращает "focused". Значение выбранной ветки становится результатом выражения match и всей функции.

Шаблон _ обрабатывает значения, не совпавшие с предыдущими вариантами. Здесь он принимает также 0 и отрицательные числа. Сохраните эту ветку, чтобы такие входные данные тоже давали результат. На следующем занятии вы отклоните такую длительность до создания задачи.

Если вывод отличается, проверьте состояние и длительность каждой задачи. Завершённая задача выводит done и ничего не добавляет к сумме независимо от длительности.

Выберите коллекцию

Что требуется программеКоллекция
Элементы по порядку с допустимыми повторениямиArray
Поиск значения по ключуMap
Различные элементы без повторенийSet

Попробуйте

Добавьте третьим элементом массива УчебнаяЗадача { название: "Review output", минуты: 5, выполнена: true }. Предскажите новую строку и оставшееся время, затем проверьте и запустите файл.

Показать ответ

Появится строка Review output: done. Целочисленная переменная осталось сохранит значение 25, поэтому последняя строка останется remaining: 25 minutes. Новая задача завершена, поэтому цикл пропускает сложение, а темп возвращает результат до match.

Переходите к следующему занятию

Можно продолжать, когда вы нашли значение по умолчанию false и можете объяснить разные метки двух задач. Найдите также условие if, исключающее завершённые задачи из суммы.

Перейдите к разделу Ошибки и ресурсы, чтобы обработать неверную длительность. Подробные правила описаны в разделах Записи и номинальные данные, Шаблоны и управление потоком и Коллекции и включения.