Раздел 41 · Zig с нуля

Функции и параметры

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Функции и параметры

На кухне есть инструкция «порезать два яблока». Она не зависит от того, кто принёс яблоки, зато требует понятного входа и результата. Если рецепт незаметно берёт продукты из чужой корзины, повторить его сложнее. Функция тоже выигрывает от ясных параметров и возврата.

Возьмём расчёт доставки: цена за коробку и количество коробок. Одна функция должна решать одну задачу и не менять внешние данные ради вычисления.

Одна мысль урока

Сигнатура функции сообщает входы и результат раньше, чем читатель открывает тело.

Опора из прошлого урока: Перечисления и объединения.

От картинки к записи

Функция

начинается с fn. После имени идут параметры, затем тип возвращаемого значения. В fn delivery(price: u16, boxes: u16) u32 входы два, результат один. Это краткий договор между вызывающим кодом и реализацией.

Параметр отличается от аргумента: параметр находится в определении, аргумент передаётся в конкретном вызове. У delivery(100, 3) аргументы это числа 100 и 3. Названия price и boxes существуют внутри функции и помогают объяснить их роли.

return завершает функцию и передаёт результат. Если в разных ветках есть несколько возвратов, каждый должен соответствовать объявленному типу. Ранний возврат полезен для простого особого случая, но не должен случайно обрывать цикл до обработки всех элементов. Этот риск мы уже видели в уроке про управление потоком.

Параметры значений не становятся изменяемыми локальными переменными автоматически. Для локального изменения можно создать var копию. Если требуется изменить объект вызывающего, это нужно показать доступом по указателю. Передача среза тоже копирует значение, но его элементы могут оставаться общими: копируется представление, а не обязательно содержимое.

Функция с результатом void не возвращает полезного значения. Например, она может менять объект через параметр. Функция с !void также допускает ошибку. Не путай отсутствие результата с отсутствием эффектов: печать не возвращает число, но меняет внешний мир.

pub открывает объявление для использования из другого файла. Для нескольких функций в одном файле оно не требуется. У задач проверка импортирует src/main.zig, поэтому проверяемые функции должны быть pub. Это требование доступа, а не ускорение или способ сделать функцию главной.

Для устойчивого расчёта расширяем price до u32 перед умножением. Произведение двух максимальных u16 помещается в u32, и договор охватывает весь диапазон аргументов. Если написать результат u16, функция окажется корректной только для части входов, даже если маленький пример проходит.

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

премиум-урок

Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.

Оплата пока не подключена: премиум и курсы открываются промокодом.