On branch main

modified:   src/ch08.md
This commit is contained in:
zed
2023-11-17 21:33:46 +03:00
parent 02bf5b0b98
commit ae709cbfc3

View File

@@ -34,7 +34,7 @@ const Writer = struct {
а про `*anyopaque` мы вскоре поговорим) и `writeAllFn`, это
указатель на функцию, которая реализует данный метод.
Заметим, что функция `writeAll`, входящая в состав нашей стркутуры-интерфейса,
Заметим, что функция `writeAll`, входящая в состав нашей структуры-интерфейса,
просто вызывает реализацию по указателю `writeAllFn`, передавая ей,
наряду с другими параметрами, указатель `ptr`.
@@ -62,7 +62,7 @@ const File = struct {
как мы получаем `std.mem.Allocator` при помощи вызова `gpa.allocator()`.
В целом, тут нет ничего странного и необычного, за исключением, пожалуй,
одного факта, а именно, присваивания `.ptr = self`, слева у нас
`*anyopaque`, справв `*File`. В общем, мы тут просто создаём некую
`*anyopaque`, справа `*File`. В общем, мы тут просто создаём некую
структуру, а что касается этого присваивания, то в нём тоже нет чего-то
сверх-особенного. Автоматическое приведение типов в Zig должно
гарантировать безопасность и отсутствие неоднозначностей, а эти два
@@ -244,7 +244,7 @@ const Writer = struct {
Чтобы лучше понять `init`, давайте посмотрим, как эта функция
используется. Функция `File.writer`, которая ранее создавала интерфейс
непосредственно, теперь далает это не так:
непосредственно, теперь делает это не так:
```zig
fn writer(self: *File) Writer {
@@ -284,7 +284,7 @@ union), которая полностью описывает тип. Далее
преобразование `*anyopaque` к тому, что нужно для данной реализации, что
и делалось с помощью `@ptrCast(@alignCast(ptr))`. В новой, более
изощрённой версии, каждая реализация всё так же должна это делать, мы
просто изловичились и встроили это в сам интерфейс, задействовав
просто изловчились и встроили это в сам интерфейс, задействовав
возможности Zig по генерации исходного кода во время компиляции.
Последняя часть этого кода это вызов функции посредством
@@ -327,7 +327,7 @@ if (ptr_info.Pointer.size != .One) @compileError("ptr must be a single item poin
```
Таким образом делаются дополнительные проверки во время компиляции,
а именно, проверяется, что `ptr` это указатель и не просто указаьтель,
а именно, проверяется, что `ptr` это указатель и не просто указатель,
а указатель на одиночную сущность (а не на массив, в Zig это разные вещи).
Также вместо вызова функции посредством