Если у вас есть переменные одного типа, их можно собрать в массив. Массив — это контейнерный тип, тип элементов которого задаётся с помощью []type, например []float. Массив полезен тем, что его можно масштабировать до любого количества хранящихся в нём элементов без изменения кода доступа к ним.
Например, если в игре есть несколько игроков, то можно создать массив и инициализировать его всеми игроками.
Players : []player = array{Player1, Player2}В Verse реализован подход, при котором определение отражает назначение объекта. Определение и использование массива также реализует этот подход.
Длина массива
Количество элементов в массиве можно получить, обратившись к члену Length массива. Например, array{10, 20, 30}.Length возвращает 3.
Обращение к элементам массива
Элементы в массиве хранятся в тех же позициях, где они были записаны, и можно получить доступ к элементу в определённой позиции, т. е. по его индексу в массиве. Например, чтобы получить первого игрока, нужно обратиться к массиву Players с помощью выражения Players[0].
Первый элемент в массиве имеет индекс 0, а индекс каждого последующего элемента увеличивается на единицу. Например, array{10, 20, 30}[0] возвращает 10, а array{10, 20, 30}[1] — 20.
Индекс | 0 | 1 | 2 |
Element | 10 | 20 | 30 |
Последний индекс в массиве на единицу меньше длины массива. Например, array{10, 20, 30}.Length — это 3, а индекс элемента 30 в array{10, 20, 30} равен 2.
Выражение для доступа к элементу массива является выражением с неоднозначным результатом и может использоваться только в контексте, допускающем неоднозначность, таком как выражение if. Пример:
ExampleArray : []int = array{10, 20, 30, 40, 50}
for (Index := 0..ExampleArray.Length - 1):
if (Element := ExampleArray[Index]):
Print("{Element} in ExampleArray at index {Index}")Этот код выводит следующее:
10 in ExampleArray at index 0
20 in ExampleArray at index 1
30 in ExampleArray at index 2
40 in ExampleArray at index 3
50 in ExampleArray at index 4Изменение массива и его элементов
Массивы, как и все прочие значения в Verse, являются неизменяемыми. Если определить переменную массива, то можно присвоить этой переменной новый массив или изменить его отдельные элементы.
Пример:
# Array1 is an array of integers
Array1 : []int = array{10, 11, 12}
# Array2 is an array variable of integers
var Array2 : []int = array{20, 21, 22}
# we concatenate Array1, Array2, and a new array of integers
# and assign that to the Array2 variable
set Array2 = Array1 + Array2 + array{30, 31}
Этот код выводит следующее:
10 at index 0
77 at index 1
12 at index 2
20 at index 3
21 at index 4
22 at index 5
30 at index 6
31 at index 7Многомерные массивы
Все массивы в предыдущих примерах были одномерными, но можно создавать и многомерные массивы. В многомерных массивах за каждым индексом хранится другой массив или массивы, подобно столбцам и строкам в таблице.
Например, приведённый ниже код создаёт двухмерный (2D) массив из следующей таблицы:
var Counter : int = 0
Example : [][]int =
for (Row := 0..3):
for(Column := 0..2):
set Counter += 1| Колонна 0 | Столбец 1 | Столбец 2 | |
|---|---|---|---|
Строка 0 | 1 | 2 | 3 |
Строка 1 | 4 | 5 | 6 |
Строка 2 | 7 | 8 | 9 |
Строка 3 | 10 | 11 | 12 |
Для доступа к элементам двухмерного массива необходимо использовать два индекса. Например, Example[0][0] — это 1, Example[0][1] — это 2 и Example[1][0] — это 4.
Следующий код показывает, как использовать выражение for для перебора элементов двухмерного массива Example.
if (NumberOfColumns : int = Example[0].Length):
for(Row := 0..Example.Length-1, Column := 0..NumberOfColumns):
if (Element := Example[Row][Column]):
Print("{Element} at index [{Row}][{Column}]")Этот код выводит следующее:
1 at index [0][0]
2 at index [0][1]
3 at index [0][2]
4 at index [1][0]
5 at index [1][1]
6 at index [1][2]
7 at index [2][0]
8 at index [2][1]
9 at index [2][2]
10 at index [3][0]
Количество столбцов в каждой строке не обязательно должно быть одинаковым.
Так, приведённый код создаёт двухмерный (2D) массив из таблицы ниже, где количество столбцов в каждой следующей строке больше, чем в предыдущей:
Example : [][]int =
for (Row := 0..3):
for(Column := 0..Row):
Row * Column| Колонна 0 | Столбец 1 | Столбец 2 | Столбец 3 | |
|---|---|---|---|---|
Строка 0 | 0 | |||
Строка 1 | 0 | 1 | ||
Строка 2 | 0 | 2 | 4 | |
Строка 3 | 0 | 3 | 6 | 9 |
Сохраняемый тип
Массив является сохраняемым, если тип элементов в массиве является сохраняемым. Это означает, что вы можете использовать их в переменных weak_map, входящих в область видимости модуля, и их значения будут сохраняться в течение всех игровых сессий. Подробнее о сохраняемых элементах в Verse см. в статье Использование сохраняемых данных в Verse.