Wie initialisiert man eine Struktur?

Ich habe eine Struktur wie folgt:

struct fooStruct {
  uint foo;
  uint figther;
}

Ich möchte diese Struktur initialisieren, aber sie wird nicht in einer Zuordnung, sondern in einem Array gespeichert.

Gibt es eine Möglichkeit, die Struktur wie zu initialisieren

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

gute Frage. In den Solidity-Dokumenten nicht gut abgedeckt. Das hat mir heute ein gutes Stück Zeit gespart.

Antworten (1)

Ja, einfach verwenden

fooStruct myStruct = fooStruct(1,2);

Oder

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

Oder

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

Weitere Beispiele finden Sie in der Dokumentation

Groß! kannst du tun fooStruct myStruct = fooStruct(); myStruct.figther = 2;?
Beispiel hinzugefügt
@Tjaden, Was ist, wenn eines der Mitglieder optional ist? Wie sollte sich das Definieren der Struktur oder das Zuweisen ändern? ZB: wenn ich möchte, dass der Kämpfer einen vordefinierten Wert oder NULLWert hat.
Der Wert jedes Members ist standardmäßig der 0Wert für diesen Typ ( 0für Ints, falsefür Bools usw.). Wenn Sie einen "Standardwert" haben möchten, der sich vom Wert "0" unterscheidet, können Sie entweder einen Bool-Wert verwenden, der anzeigt, dass ein Wert auf "0" gesetzt wurde, anstatt standardmäßig auf 0 zu setzen. Sie können auch einen Trick verwenden wobei Sie das höchstwertige Bit jedes Werts als "gesetztes" Bit verwenden, dann verwenden Sie einfach den Rest wie für den tatsächlichen Wert.
Hat das solidity-Array eine filter/ first-Funktion, die ein Lambda-Prädikat akzeptiert?
Wie initialisiere ich es von außerhalb des Vertragsbereichs? ZB aus einer Testdatei?