From 2dd5185d3659e0e0554d7138b2d40576d4af448e Mon Sep 17 00:00:00 2001 From: zed Date: Thu, 9 Nov 2023 14:08:34 +0300 Subject: [PATCH] On branch main modified: src/ch01.md --- src/ch01.md | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/src/ch01.md b/src/ch01.md index d558030..f77a56b 100644 --- a/src/ch01.md +++ b/src/ch01.md @@ -32,7 +32,7 @@ pub const User = struct { Сохраните этот исходный текст в файл с именем `ex-ch01-01.zig` и запустите его следующим образом: ``` -zig ex-ch01-01.zig +zig run ex-ch01-01.zig ``` Вы должны увидеть @@ -46,7 +46,88 @@ zig ex-ch01-01.zig ## Импортирование библиотек -Редко когда бывает, что исходные тексты программа содержатся в одном-единственном файле +Редко когда бывает, что исходные тексты программы содержатся в одном-единственном файле и при этом программа не использует никакие библиотеки. Наша первая программа также не является исключением - она использует стандартную библиотеку Zig для того, чтобы напечатать -строчку, которую мы только что видели. +строчку, которую мы только что видели. Система импорта/экспорта в Zig достаточно проста +и базируется на 2-х вещах + +* `@import` - это встроенная в компилятор функция +* `pub` - ключевое слово для экспортирования чего-то + +При импортировании модуля нужно указать его имя. Стандартная библиотека Zig доступна +по имени `std`. Чтобы импортировать какой-то конкретный файл, нужно использовать +путь относительно того файла, в котором делается имортирование. Например, мы могли +бы поместить описание структуры `User` в отдельный файл (скажем, `models/user.zig`) +и тогда бы в основном файле мы бы написали + +```zig +const User = @import("models/user.zig").User; +``` + +При этом эта структура должна быть помечена как `pub`, в противном случае мы получим +ошибку компиляции, в которой будет сказано, что эта структура не является публичной. + +Наш гипотетический `models/user.zig`, помимо структуры `User`, может экспортировать +и другие вещи. Например, мы могли бы также экспортировать константу: + +```zig +// models/user.zig +pub const MAX_POWER = 100_000; + +pub const User = struct { + power: u64, + name: []const u8, +}; +``` + +И тогда бы могли в главном файле имортировать обе сущности: + +``` +const user = @import("models/user.zig"); +const User = user.User; +const MAX_POWER = user.MAX_POWER; +``` + +Скорее всего, на данный момент у Вас больше вопросов, чем ответов. +Что такое `user` в приведенном отрывке? Хотя мы ещё не знакомы с ключевым +словом `var`, но тем не менее можно спросить, а что если вместо `const` +использовать `var`? Или. возможно, у Вас возник вопрос по поводу использования +сторонних библиотек. Это всё хорошие вопросы, но чтобы ответить на них, +нам нужно глубже изучить Zig, а пока нам придётся смириться с тем, что мы уже +знаем: + +* как импортировать стандартную библиотеку (`const std = @import("std");`) +* как импортировать свои собственные файлы (`const user = @import(models/user.zig)`) +* как экспортировать те или иные определения (`pub const ...`) + +## Комментарии + +``` +// Если тут убрать слово 'pub', то этот код не откомпилируется +``` + +В Zig нет многострочных комментариев в стиле C (`/* ... */`), но зато есть 3 различных +вида однострочных: + +* `//` - обычные комментарии в стиле C++ +* `//!` - комментарии "верхнего уровня", размещаются в начале файла +* `///` - документирующие комментарии, располагаются перед определениями + +## Функции + +После комментария в нащем примере идёт строчка + +```zig +pub fn main() void { +``` + +Это начало главной функции программы. В каждом исполнимом файле должна существовать +функция, с которой начинается выполнение, это входная точка программы. Если переименовать +`main` во что-то другое, например, в `doIt` и попытаться запустить нашу +программу, то мы получим сообщение об ошибке, в котором говорится, что в нашем +файле нет функции `main`: + +``` +/opt/zig-0.11/lib/std/start.zig:559:45: error: root struct of file 'ex-ch01-01' has no member named 'main' +```