Сохраните несколько учебных задач, выведите метку для каждой и сложите время незавершённых задач. Найдите значение по умолчанию для состояния задачи и проследите, как if и match выбирают вывод.
Сначала пройдите раздел Значения и функции. Вам снова понадобятся параметры, результаты функций и переменная с let mut для накопления суммы.
Сохраните и перечислите задачи
Сохраните код в файле 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Проверка завершается с кодом 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, исключающее завершённые задачи из суммы.
Перейдите к разделу Ошибки и ресурсы, чтобы обработать неверную длительность. Подробные правила описаны в разделах Записи и номинальные данные, Шаблоны и управление потоком и Коллекции и включения.