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);
   }
}