Переменные: const и var
На коробке с расходниками есть две карточки. На первой написан артикул, который не меняют во время работы. На второй отмечают остаток: было десять, стало девять. Если обе карточки разрешено переписывать, сложнее заметить случайную подмену артикула. В программе неизменяемое имя помогает так же.
Сегодня считаем свободные места в небольшой группе. Вместимость остаётся постоянной, число занятых мест меняется. Отделим эти два факта не комментариями, а записью объявлений.
Одна мысль урока
const фиксирует привязку имени, var разрешает присваивание нового значения.
Опора из прошлого урока: Философия явности: что отличает Zig от C.
От картинки к записи
Переменная не
обязана меняться. Слово обозначает место для значения, а возможность изменения определяется
объявлением. В Zig const не разрешает присвоить имени новый результат, а var разрешает. Привычка
начинать с const снижает число состояний, которые нужно держать в голове.
Объявление const capacity: u16 = 10; содержит четыре части: правило изменения, имя, тип и начальное значение. Двоеточие отделяет тип, знак равенства отделяет значение. Когда тип ясен из правой части, его иногда можно не писать. Но для первого числового примера явный u16 удобнее: он показывает, что речь об ограниченном целом числе, а не о числе произвольного размера на этапе компиляции.
У var booked: u16 = 2; начинается история изменения. После booked += 1 там уже три. Оператор += сокращает «прочитай прежнее значение, прибавь один, присвой обратно». Он не изменяет capacity. Если функция только читает параметр, не нужно делать его изменяемым ради привычки из другого языка.
Zig сообщает, если локальная переменная объявлена через var, но никогда не меняется. Это не просьба добавить ненужное изменение. Обычно нужно заменить var на const. Компилятор помогает привести запись к реальному поведению. Предупреждение нельзя чинить фиктивным присваиванием: такой код мешает следующему читателю.
Важно различать неизменяемое имя и неизменяемые данные за указателем. К этому вернёмся в уроке про память. const может хранить адрес изменяемого объекта: адрес не меняется, а объект меняется. Сегодня у нас обычные числа, поэтому этого второго уровня нет. Но не делай из сегодняшнего примера вывод, что const замораживает всё, до чего можно дотянуться.
Имя существует внутри своей области видимости, участка программы между определёнными границами. В наших примерах граница это тело теста или функции. Имя, созданное в тесте, нельзя прочитать из соседнего теста без передачи значения. Это полезно: каждый пример имеет свои исходные данные и не зависит от того, какой тест был запущен раньше.
Выбирай имена по роли. capacity и booked отвечают, что измеряется. a и b заставляют читателя открывать соседние строки. Единицы измерения тоже важны: количество мест и стоимость места могут иметь одинаковый тип u16, но складывать их обычно бессмысленно.
премиум-урок
Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.
Оплата пока не подключена: премиум и курсы открываются промокодом.