On branch main
modified: src/ch08.md
This commit is contained in:
10
src/ch08.md
10
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 это разные вещи).
|
||||
|
||||
Также вместо вызова функции посредством
|
||||
|
||||
Reference in New Issue
Block a user