В чём в zig состоит отличие между `..` и `...`?

Изучая zig, я наткнулся на две очень похожие конструкции в синтаксисе: .. и ....

Пример с ..:

for (0..10) |i| {
    std.debug.print("{d}\n", .{i});
}

В этом примере нельзя заменить .. на .... Но в примере со switch:

x = switch (x) {
    -1...1 => -x,
    else => x,
};

Используются три точки. В чём различие этих двух конструкций?


Ответы (2 шт):

Автор решения: user7860670

for оперирует с срезами (slice), поэтому там для простой итерации по диапазонам натуральных чисел был позаимствован синтаксис с двумя точками, который используется для задания диапазона срезов. Его существенное отличие от синтаксиса с тремя точками, который используется для задания диапазонов в switch заключается в том, что конечный элемент диапазона исключается.

Например for (0..3) |x| будет исполнен для значений x 0, 1, 2, а ветка switch(x) 0...3 => ... будет выполнена при значениях x 0, 1, 2, 3.

→ Ссылка
Автор решения: Grundy

Из того что удалось найти, только комментарии в примерах в документации:

Для for

// To iterate over consecutive integers, use the range syntax.
// Unbounded range is always a compile error.
// Для итерации по последовательным целым числам используйте range-синтаксис.
// Неограниченный диапазон всегда является ошибкой компиляции.
var sum3: usize = 0;
for (0..5) |i| {
    sum3 += i;
}

Для ...

// Ranges can be specified using the ... syntax. These are inclusive
// of both ends.
// Диапазон может быть определен с помощью "... синтаксиса". 
// Он включает оба конца.
5...100 => 1,
→ Ссылка