CSL предоставляет несколько «похожих на массив» инструментов, покрывающих большинство игровых задач: фиксированные массивы, срезы и динамические массивы. Эта страница — практическое руководство по их использованию без опасных ошибок.
Быстрый глоссарий
Фиксированный массив: [N]T — размер известен во время компиляции.
Срез / управляемый массив: []T — представление над данными массива (часто используется для параметров).
Динамический массив: [..]T — изменяемый список с количеством и вместимостью.
fixed:[4]int={1,2,3,4};view:[]int=fixed;// представление (срез)list:[..]int;list->append(10);list->append(20);
Методы динамических массивов используют -> (например, list->append(x)). Поля используют . (например, list.count).
Динамические массивы ([..]T)
Динамические массивы — это «списочный тип по умолчанию» для игрового кода.
Если вы знаете, что добавите много элементов, сначала зарезервируйте место, чтобы избежать повторных перераспределений.
Удаление элементов
Обычно вы выбираете между быстрым удалением (порядок не важен) и упорядоченным удалением (с сохранением порядка).
Также можно удалить по индексу:
Очистка
Передача массивов в процедуры
Многие API принимают []T (срез/представление). Динамические массивы можно передавать там, где []T ожидается.
Шаблоны итерации
Итерация по элементам
Итерация по индексам (включительные диапазоны)
0..n-1 обычно используется для «слотовых» циклов:
Диапазоны включительные. Если вам нужен типичный цикл «0 до count-1», напишите 0..count-1.
Замыкания, колбэки и userdata (важно)
CSL не имеют замыкания. Встроенные proc() { ... } определения не могут захватывать внешние переменные.
Когда нужны колбэки (обработчики UI, хук смерти и т. п.), свяжите колбэк с userdata: Object полем.
Справочник API
Каждый проект включает папку api_reference/ , содержащую последнюю версию основной поверхности API. Если вы пытаетесь найти «какие методы существуют у этого типа?», эта папка является источником истины.
values: [..]int;
values->append(10);
values->append(20);
values->append(30);
values->unordered_remove_by_value(20); // меняет местами с последним, быстро
values->ordered_remove_by_value(10); // сдвигает, сохраняет порядок