On branch main

modified:   src/ch01.md
modified:   src/ch02.md
This commit is contained in:
zed
2023-11-10 11:16:07 +03:00
parent ef9ade00d0
commit a035418c74
2 changed files with 30 additions and 2 deletions

View File

@@ -361,3 +361,32 @@ const c = [_]i32{1, 2, 3, 4, 5};
по указателям далее, а пока Вы можете представлять себе срез как некое "окно"
в массиве.
Однако, не всё так просто. Рассмотрим следующий отрывок кода:
```zig
const a = [_]i32{1, 2, 3, 4, 5};
const b = a[1..4];
```
С виду `b` это вроде как срез с началом, показывающим на `a[1]` и длиной 3
(правая граница интервала не включается). Но нет. Мы сделали срез массива `a`,
используя границы "окна", кторые известны во время компиляции, то есть `1` и `4`.
длина среза (4 - 1 = 3) тоже известна во время компиляции, поэтому `b` это
по факту не срез, а указатель на на массив целых чисел длиной 3, то есть `*const [3]i32`.
Таким образом, сообразительность Zig сбила наши планы сделать (настоящий) срез.
Но сейчас мы его немножео обдурим, так сказать:
```zig
const a = [_]i32{1, 2, 3, 4, 5};
var end: usize = 4;
const b = a[1..end];
```
Теперь `b` это в полной мере срез, то есть тип переменной `b` это `[]const i32`.
Теперь длина не является частью типа, потому что она известна лишь
во время исполнения (потому что мы поместили правую границу среза в переменную `end`).
Отметим также, что при создании среза можно опустить правую/верхнюю границу,
тогда срез продлится до конца того, от чего мы его делаем, например `const c = b[2..];`.
И последнее - если бы мы написали `const end: usize = 4;`, а не `var end: usize = 4;`,
то опять получили бы не срез (указатель + длина), а указатель на массив.

View File

@@ -1,3 +1,2 @@
# Обзор языка. Часть ii
# Обзор языка. Часть II