Solidity - Массивы
Массив - это структура данных, которая хранит последовательную коллекцию фиксированного размера элементов одного типа. Массив используется для хранения набора данных, но часто бывает более полезно думать о массиве как о коллекции переменных одного типа.
Вместо объявления отдельных переменных, таких как number0, number1, ... и number99, вы объявляете одну переменную массива, такую как числа, и используете числа [0], числа [1] и ..., числа [99] для представления отдельные переменные. Доступ к определенному элементу в массиве осуществляется по индексу.
В Solidity массив может иметь фиксированный размер во время компиляции или динамический размер. Для массива хранения он также может иметь разные типы элементов. В случае массива памяти тип элемента не может быть отображен, и в случае, если он будет использоваться в качестве параметра функции, тип элемента должен быть типом ABI.
Все массивы состоят из непрерывных ячеек памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес - последнему элементу.
Объявление массивов
Чтобы объявить массив фиксированного размера в Solidity, программист указывает тип элементов и количество элементов, необходимых для массива, следующим образом:
type arrayName [ arraySize ];
Это называется одномерным массивом. ВarraySize должен быть целочисленной константой больше нуля и typeможет быть любым допустимым типом данных Solidity. Например, чтобы объявить массив из 10 элементов с именем balance типа uint, используйте этот оператор:
uint balance[10];
Чтобы объявить массив динамического размера в Solidity, программист указывает тип элементов следующим образом:
type[] arrayName;
Инициализация массивов
Вы можете инициализировать элементы массива Solidity либо один за другим, либо с помощью одного оператора следующим образом:
uint balance[3] = [1, 2, 3];
Количество значений в скобках [] не может быть больше количества элементов, которые мы объявляем для массива в квадратных скобках []. Ниже приведен пример назначения одного элемента массива:
Если вы не укажете размер массива, будет создан массив, достаточно большой, чтобы вместить инициализацию. Поэтому если написать -
uint balance[] = [1, 2, 3];
Вы создадите точно такой же массив, как и в предыдущем примере.
balance[2] = 5;
Приведенный выше оператор присваивает элементу номер 3- й в массиве значение 5.
Создание массивов динамической памяти
Массивы динамической памяти создаются с использованием ключевого слова new.
uint size = 3;
uint balance[] = new uint[](size);
Доступ к элементам массива
Доступ к элементу осуществляется путем индексации имени массива. Это делается путем помещения индекса элемента в квадратные скобки после имени массива. Например -
uint salary = balance[2];
Приведенный выше оператор возьмет 3- й элемент из массива и присвоит значение переменной зарплаты. Ниже приводится пример, в котором будут использоваться все три вышеупомянутых концепции, а именно. объявление, присвоение и доступ к массивам -
Члены
length- length возвращает размер массива. length можно использовать для изменения размера динамического массива при его установке.
push- push позволяет добавить элемент в динамический массив хранения в конце. Возвращает новую длину массива.
пример
Попробуйте использовать следующий код, чтобы понять, как массивы работают в Solidity.
pragma solidity ^0.5.0;
contract test {
function testArray() public pure{
uint len = 7;
//dynamic array
uint[] memory a = new uint[](7);
//bytes is same as byte[]
bytes memory b = new bytes(len);
assert(a.length == 7);
assert(b.length == len);
//access array variable
a[6] = 8;
//test array variable
assert(a[6] == 8);
//static array
uint[3] memory c = [uint(1) , 2, 3];
assert(c.length == 3);
}
}