Используйте 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Проверка завершается с кодом 0. Программа печатает следующий результат.
Run first program: done
Build application: focused
remaining: 25 minutesПроследите каждое решение
Цикл даёт каждому элементу массива имя задача. Для выполненной задачи условие !задача.выполнена ложно, поэтому осталось сохраняет 0. Функция темп возвращает "done" до перехода к match.
Вторая задача ещё не выполнена. Её 25 минут прибавляются к осталось. В функции темп число 25 попадает в диапазон 16..30, поэтому результат равен "focused".
match вычисляет задача.минуты один раз и проверяет ветви сверху вниз. Каждая ветвь case содержит шаблон и результат. Шаблон диапазона проверяет попадание в интервал. _ принимает остальные значения, поэтому другие целые числа дают "deep".
| Задача | Выбор | Результат |
|---|---|---|
| Выбрать по логическому условию | if | Выполняется выбранная ветвь |
| Выбрать по значению или его структуре | match | Выбранная ветвь даёт значение |
| Обработать элементы по порядку | for | Тело выполняется для каждого элемента |
Используйте if condition { ... } else { ... }, если нужны оба исхода. Чтобы использовать if или match как значение, задайте совместимые типы результатов ветвей. Цикл for как выражение собирает результаты тела в Array. Цикл for в позиции инструкции и цикл while выполняют действия без результирующего значения.
Проверяйте и называйте значения шаблонами
Шаблон может проверить значение, дать ему имя или извлечь его части. Литеральный шаблон и шаблон диапазона проверяют значение. Имя вроде задача связывается со значением без проверки его содержимого.
Some(значение) извлекает присутствующее значение из Option. Err(сообщение) извлекает ошибку из Result. Шаблон записи извлекает указанные поля. Объявления записей и перечислений описаны в разделе Записи и номинальные данные.
Шаблон массива [head, ..tail] связывает первый элемент с head, а остальные с массивом tail. _ принимает значение без привязки к имени.
Используйте if let pattern = value { ... }, чтобы выполнить блок при совпадении с одним шаблоном. Для обработки несовпадения добавьте else. Цикл while let повторяется до первого несовпадения. Созданные ими имена неизменяемы и доступны внутри успешного блока.
Исправьте шаблон
В шаблоне массива замените [head, ...tail] на [head, ..tail]. Три точки раскрывают массив в литерале или вызове. Две точки собирают оставшиеся элементы в шаблоне.
Создавайте значение перечисления с именем типа, например Состояние.Приостановлен("review"). В ветви используйте имя варианта, например case Приостановлен(причина) =>.
Полнота сопоставления и правила обхода
- Сопоставление перечисления должно обрабатывать все объявленные варианты. Дополнительное условие ветви называют guard. Ветвь с таким условием не учитывается при проверке полноты.
- Если статическая проверка не устанавливает полноту сопоставления, добавьте явную ветвь
_для оставшихся случаев. - Шаблоны вычисляются слева направо. Имена из неудачной альтернативы недоступны в следующих альтернативах.
- Несовпадение шаблона во включении вызывает ошибку выполнения. Отберите элементы через
ifдо того, как следующий шаблон извлечёт их части. - Массивы, целочисленные диапазоны, множества и
map.keysимеют заданный порядок обхода. Для строк перед обходом нужны скалярные операции. - Пользовательские шаблоны и обход, генераторы, обработка исключений и метки на
whileилиforне поддерживаются.
Продолжите в разделе Коллекции и включения, чтобы выбрать коллекцию и отфильтровать её значения.