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

У меня есть такая структура:

struct fooStruct {
  uint foo;
  uint figther;
}

Я хотел бы инициализировать эту структуру, но она будет храниться не в сопоставлении, а внутри массива.

Есть ли способ инициализировать структуру, например

fooStruct myStruct = fooStruct.new(par1,2,3)

хороший вопрос. Недостаточно подробно описан в документации Solidity. Это сэкономило мне кучу времени сегодня.

Ответы (1)

Да, просто используйте

fooStruct myStruct = fooStruct(1,2);

Или же

fooStruct myStruct = fooStruct({foo:1, fighter:2});

Или же

fooStruct memory myStruct; // for temporary data
myStruct.figther = 2; // will only write to memory

fooStruct storage myStruct = ...; // for persistent data, has to be initialized from a state variable. `storage` is the default and a warning will be thrown by Solidity compiler versions starting with 4.17
myStruct.fighter = 2; // will write directly to storage

Дополнительные примеры см. в документации

Большой! ты можешь сделать fooStruct myStruct = fooStruct(); myStruct.figther = 2;?
Добавлен пример
@Tjaden, Что делать, если один из членов является необязательным. Как следует определять структуру или присваивать изменения? Например: если я хочу, чтобы боец ​​имел предопределенное значение или NULLзначение.
Значение каждого члена будет по умолчанию 0равно значению для этого типа ( 0для целых чисел, falseдля логических значений и т. д.). Если вы хотите иметь значение «по умолчанию», отличное от значения «0», вы можете либо иметь логическое значение, указывающее, что значение было установлено на «0», а не по умолчанию на 0. Вы также можете использовать трюк где вы используете самый значащий бит каждого значения в качестве «установленного» бита, а затем просто используете остальные, как для фактического значения.
Есть ли в массиве Solidity функции filter/ first, которые принимают лямбда-предикат?
Как инициализировать его из-за пределов контракта? Например, из тестового файла?