On branch main
modified: src/ch01.md modified: src/ch02.md
This commit is contained in:
29
src/ch01.md
29
src/ch01.md
@@ -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;`,
|
||||
то опять получили бы не срез (указатель + длина), а указатель на массив.
|
||||
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
|
||||
# Обзор языка. Часть ii
|
||||
|
||||
# Обзор языка. Часть II
|
||||
|
||||
Reference in New Issue
Block a user