Эта страница описывает Топаз v5.17. Прежде чем считать её актуальной, сверьте поле version в /version.json со значением 5.17.
Результат: вы опишете небольшую предметную область записью и коллекцией, а затем выберете if, match и for по вопросу, на который отвечает каждая конструкция.
Что нужно знать: завершите Значения и функции и разберитесь с привязками, аннотациями, параметрами и результатами функций.
Задайте форму каждой задаче
Создайте data-control.tpz:
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")Повторите уже знакомые два шага:
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.
Самостоятельные правила находятся в разделах Шаблоны и управление потоком, Записи и номинальные данные и Коллекции и включения. Переходите к Ошибкам и ресурсам.