Результат: вы свяжете наблюдаемые значения с проверяемыми типами и дадите повторяющемуся вычислению имя функции. Вы разберёте работу вывода типов и увидите, в каких местах явные аннотации помогают читателю кода.
Что нужно знать: пройдите раздел Первая программа и научитесь выполнять topaz check перед topaz run.
Расширьте рабочий файл
Создайте values-functions.tpz:
function осталосьМинут(всего: int, потрачено: int) -> int {
всего - потрачено
}
let тема = "Topaz basics"
let всего: int = 45
let потрачено = 20
let mut занятия = 0
занятия = занятия + 1
print("{тема}: {осталосьМинут(всего, потрачено)} minutes left")
print("sessions: {занятия}")Проверьте и запустите код:
topaz check values-functions.tpz
topaz run values-functions.tpzНаблюдаемый результат:
Topaz basics: 25 minutes left
sessions: 1Читайте от результата к исходнику
Первая строка содержит результат вызова осталосьМинут(45, 20). Сигнатура задаёт два параметра int и определяет тип результата int.
Объявление параметров (всего: int, потрачено: int) и типа результата -> int прямо показывает контракт функции. Запись : int после каждого имени параметра сообщает читателю, какие именно данные принимает функция. Запись -> int после списка параметров объявляет тип значения, которое функция возвращает. Такая сигнатура позволяет понять назначение и правила использования функции без необходимости изучать всё её тело.
Последнее выражение всего - потрачено становится результатом функции без явного return. В Топазе последнее выражение в теле функции автоматически образует возвращаемое значение. Используйте return, когда важно показать досрочный выход. Объявленный тип результата всё равно действует для каждого выхода.
Для тема и потрачено аннотации не требуются. В этих случаях работает вывод типов. Язык Топаз самостоятельно определяет тип привязки по её начальному значению. Для строки "Topaz basics" выводится тип строки, а для числа 20 выводится тип int. Вывод типов избавляет код от повторений, когда тип и так ясен из правого выражения.
Запись всего: int явно обозначает границу. Хотя начальное значение 45 позволяет вывести тип int, явная аннотация указывает читателю на важность этого конкретного параметра в модели программы. Все три имени неизменяемы. Их значения можно читать, но нельзя перезаписать.
занятия устроено иначе. Конструкция let mut указывает на намеренное присваивание, а следующая строка меняет значение с 0 на 1. Изменяемость следует давать той привязке, которая действительно отслеживает состояние, а не всем значениям на случай будущих изменений.
Выбор: вывод, аннотация или изменяемость?
Для локального значения с очевидным типом предпочитайте обычный let и вывод типов. При выборе между формами записи руководствуйтесь следующими правилами:
· Вывод типов подходит для локальных привязок с очевидным начальным значением.
· Добавляйте аннотацию, когда читателю важна граница.
· Добавляйте mut, только если последующее присваивание входит в модель.
· Сигнатуру функции указывайте явно, так как вызывающий код полагается на контракт параметров и результата.
Попробуйте
Замените всего на 60, а потрачено на 15, не меняя занятия. Как изменится вывод?
Показать ответ
Первая строка станет Topaz basics: 45 minutes left, а вторая останется sessions: 1. Функция получает новые аргументы и вычисляет разность 60 - 15, но отдельный изменяемый счётчик по-прежнему увеличивается один раз.
Готовы двигаться дальше, если
Вы можете объяснить выведенный тип, явную аннотацию, неизменяемую и изменяемую привязки, два параметра и выражение, которое становится результатом функции. Вы также понимаете, как сигнатура функции информирует читателя о типе входных данных и результата.
Точные формы описаны в разделах Типы и Функции и обобщения. Обобщения — последующий справочный материал, а не условие занятия. Переходите к Данным и управлению.