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

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

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

Эта страница описывает Топаз v5.17. Прежде чем считать её актуальной, сверьте поле version в /version.json со значением 5.17.

Результат: вы опишете небольшую предметную область записью и коллекцией, а затем выберете if, match и for по вопросу, на который отвечает каждая конструкция.

Что нужно знать: завершите Значения и функции и разберитесь с привязками, аннотациями, параметрами и результатами функций.

Задайте форму каждой задаче

Создайте 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

Программа печатает:

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

Проследите три решения

УчебнаяЗадача — номинальная запись: её имя и поля задают один вид значения предметной области. У выполнена есть значение по умолчанию false, поэтому второй конструктор опускает это поле. Array<УчебнаяЗадача> сообщает, что задачи — упорядоченная коллекция таких записей.

for посещает задачи в порядке массива, поэтому вывод следует тому же порядку. Внутри цикла if !задача.выполнена отвечает на один вопрос «да или нет» и увеличивает осталось только для незавершённой задачи.

темп отвечает на другой вопрос. Первый if досрочно возвращает результат для готовой задачи. Затем match классифицирует оставшиеся значения минуты по диапазонам, и строка каждой ветви становится результатом функции.

Выбор: Array, Map или Set?

Используйте Array, когда важны порядок и повторения, как в этом плане. Map подходит, если основная операция — поиск по ключу. Выбирайте Set, когда уникальность важнее позиции. Ориентируйтесь на наблюдаемое поведение, а не на сегодняшнее количество элементов.

Попробуйте

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

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

Появится Review output: done. Значение осталось останется равным 25 minutes, потому что новая задача уже выполнена и тело if для неё не запускается.

Готовы двигаться дальше, если

Вы можете объяснить, почему УчебнаяЗадача — запись, почему коллекция — Array, почему обход использует for, накопление — if, а классификация — match.

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