Как вручную инициализировать массив в Solidity?

Я не могу найти способ вручную инициализировать массив.

 string[] public cool; function constructor() { cool[0] = "one"; } 

Не выполнит, пока

 function constructor(){ cool[cool.length++] = "one"; } 

будет.

Что может быть причиной этого?

Ответы (1)

Вы не можете присвоить значение массиву размера 0, вам нужно иметь достаточно места для записи своего значения. Это правда, что вы объявили массив с переменным размером, но вам все равно нужно сказать ВМ увеличить размер массива перед его назначением.

Вы можете увеличить размер массива и присвоить значения различными способами:

  1. Все-в-одном (увеличение и установка, мое предпочтение) с использованием метода push , например:

     cool.push("one"); 
  2. С помощью двух команд установите свойство length и затем установите значение

     cool.length = 1; cool[0] = "one"; 

Не зная этого, вы фактически использовали второй способ и вручную инициализировали длину массива. Фактически, используя cool.length++ вы увеличили размер массива до 1 и сразу после этого передали 0 в качестве ключа массива (и обратите внимание, что вы передали 0, а не 1, поскольку вы использовали ++ после, а не перед переменной длины) , Все это позволяет правильно назначать «одну» строку внутри первой позиции массива.

Помимо этого, два предложения:

  • Посмотрите на отображение, если вы не хотите слишком много возиться с размерами массива. Вы можете сделать такую ​​вещь:

     mapping (int=>string) public cool; function testMapping() { cool[3] = "hello"; cool[33] = "world"; cool[333] = "!!"; } 

не заботясь о размерах.

  • Не используйте конструктор в качестве имени метода, это может ввести в заблуждение. Если вам действительно нужен конструктор контракта, он должен быть назван как имя контракта. Если вам нужна функция init, назовите ее init ().