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, хуки смерти и т. д.), связывайте колбэк с полем полем.
Справочник API
Каждый проект включает папку папку, содержащую актуальный основной API. Если вы пытаетесь найти «какие методы есть у этого типа?», эта папка — источник истины.
values: [..]int;
values->append(10);
values->append(20);
values->append(30);
values->unordered_remove_by_value(20); // меняет местами с последним, быстро
values->ordered_remove_by_value(10); // сдвигает элементы, сохраняет порядок