Изучение Топаза

Значения и функции

Добавьте в планировщик вывод и аннотации типов, неизменяемые и изменяемые привязки, параметры и проверяемый результат функции.

Результат: вы свяжете наблюдаемые значения с проверяемыми типами и дадите повторяющемуся вычислению имя функции. Вы разберёте работу вывода типов и увидите, в каких местах явные аннотации помогают читателю кода.

Что нужно знать: пройдите раздел Первая программа и научитесь выполнять topaz check перед topaz run.

Расширьте рабочий файл

Создайте values-functions.tpz:

TOPAZ
function осталосьМинут(всего: int, потрачено: int) -> int {
    всего - потрачено
}

let тема = "Topaz basics"
let всего: int = 45
let потрачено = 20
let mut занятия = 0
занятия = занятия + 1

print("{тема}: {осталосьМинут(всего, потрачено)} minutes left")
print("sessions: {занятия}")

Проверьте и запустите код:

BASH
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, но отдельный изменяемый счётчик по-прежнему увеличивается один раз.

Готовы двигаться дальше, если

Вы можете объяснить выведенный тип, явную аннотацию, неизменяемую и изменяемую привязки, два параметра и выражение, которое становится результатом функции. Вы также понимаете, как сигнатура функции информирует читателя о типе входных данных и результата.

Точные формы описаны в разделах Типы и Функции и обобщения. Обобщения — последующий справочный материал, а не условие занятия. Переходите к Данным и управлению.