Найдите в файле Топаза входы, результат и путь ошибки. На примере учебного плана проследите, где неверная длительность останавливает создание задачи.
Сначала завершите Первое приложение. Откройте его src/main.tpz и src/plan.tpz. Если вы переименовали проект, эти файлы находятся в source-unavailable.
Найдите импортируемый код
Импорт показывает, какой модуль предоставляет используемое в файле имя. Например, следующие строки подключают модули стандартной библиотеки.
import std.bytes { Bytes }
import std.jsonВ учебном плане import src.plan указывает на src/plan.tpz. Откройте этот файл, чтобы проследить работу создатьЗадачу или подвестиИтог.
Также ищите встроенные вызовы, например print, которым не нужен импорт. Для понимания доступа к файлам проверьте вызовы и разрешения пакета. Важен и профиль выполнения, который определяет доступные операции и правила запуска. Список импортов не перечисляет все операции ввода-вывода.
Найдите данные
Этот короткий пример объединяет данные учебного занятия и преобразует их в текст.
record УчебноеЗанятие {
тема: string,
минуты: int,
завершено: bool
}
function подвестиИтог(занятие: УчебноеЗанятие) -> string {
if занятие.завершено {
return "{занятие.тема}: done"
}
"{занятие.тема}: {занятие.минуты} minutes left"
}УчебноеЗанятие хранит тему, длительность и признак завершения. Сначала прочитайте эти поля. Затем найдите, какой текст возвращает подвестиИтог в зависимости от занятие.завершено.
При теме "Read", длительности 25 минут и завершено = false результатом будет "Read: 25 minutes left". При завершено = true получится "Read: done".
Прочитайте входы и результат функции
function подвестиИтог(занятие: УчебноеЗанятие) -> string называется сигнатурой функции. Она задаёт имя, параметры и возвращаемый тип.
Здесь подвестиИтог принимает УчебноеЗанятие и возвращает строку. В учебном плане создатьЗадачу возвращает Result<УчебнаяЗадача, string>. Вызывающий код может получить задачу в Ok или сообщение об ошибке в Err.
По сигнатуре найдите подходящую функцию, затем прочитайте её тело. При поиске операций с файлами и другого ввода-вывода проверьте также вызовы и профиль выполнения.
Проследите неверный ввод
В src/plan.tpz найдите разобратьМинуты(текстМинут)? внутри создатьЗадачу. Знак ? извлекает значение из Ok. При Err он немедленно возвращает ошибку из создатьЗадачу.
Теперь проследите строку "later". toInt не может преобразовать её в целое число, поэтому разобратьМинуты возвращает Err("minutes must be a positive integer"). Знак ? передаёт эту ошибку вызывающему коду до создания задачи. tests/plan.tpz проверяет полученное сообщение.
Чтобы исправить такой ввод в src/main.tpz, замените его строкой с положительным целым числом, например "25". Отличайте возвращаемые ошибки от ошибок выполнения. Например, обращение за границы массива останавливает выполнение.
Попробуйте
Прочитайте пример подвестиИтог выше. Может ли код, получивший результат, определить по его типу, завершено ли занятие?
Показать ответ
Нет. Обе ветви возвращают string. Текст сообщает о завершении, но тип этого не показывает. Если другой функции нужен признак завершения, передайте запись с этим значением, чтобы она могла прочитать поле.
Готовы двигаться дальше, если
В учебном плане найдите импорт, ведущий к src/plan.tpz, и функцию, отклоняющую "later". Проследите возврат ошибки в создатьЗадачу, затем найдите тест, который её проверяет.
Подробные правила описаны в разделах Записи и номинальные данные, Функции и обобщения и Null, Option, Result и ошибки. Незнакомую конструкцию можно найти в Кратком обзоре синтаксиса.