В чём в zig состоит отличие между `..` и `...`?
Изучая zig, я наткнулся на две очень похожие конструкции в синтаксисе: .. и ....
Пример с ..:
for (0..10) |i| {
std.debug.print("{d}\n", .{i});
}
В этом примере нельзя заменить .. на .... Но в примере со switch:
x = switch (x) {
-1...1 => -x,
else => x,
};
Используются три точки. В чём различие этих двух конструкций?
Ответы (2 шт):
for оперирует с срезами (slice), поэтому там для простой итерации по диапазонам натуральных чисел был позаимствован синтаксис с двумя точками, который используется для задания диапазона срезов. Его существенное отличие от синтаксиса с тремя точками, который используется для задания диапазонов в switch заключается в том, что конечный элемент диапазона исключается.
Например for (0..3) |x| будет исполнен для значений x 0, 1, 2, а ветка switch(x) 0...3 => ... будет выполнена при значениях x 0, 1, 2, 3.
Из того что удалось найти, только комментарии в примерах в документации:
Для 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,