From ae709cbfc307a1aa5e6b802c1d61562f073228c4 Mon Sep 17 00:00:00 2001 From: zed Date: Fri, 17 Nov 2023 21:33:46 +0300 Subject: [PATCH] On branch main modified: src/ch08.md --- src/ch08.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ch08.md b/src/ch08.md index e2f8841..442d2eb 100644 --- a/src/ch08.md +++ b/src/ch08.md @@ -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 это разные вещи). Также вместо вызова функции посредством