diff --git a/src/ch01.md b/src/ch01.md index e81a243..8d57920 100644 --- a/src/ch01.md +++ b/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;`, +то опять получили бы не срез (указатель + длина), а указатель на массив. + diff --git a/src/ch02.md b/src/ch02.md index ab7f465..0229205 100644 --- a/src/ch02.md +++ b/src/ch02.md @@ -1,3 +1,2 @@ -# Обзор языка. Часть ii - +# Обзор языка. Часть II