Was ist die Rückgabe von array.push() in Solidity?

Ich habe diese Codezeilen in cryptozombies.io gesehen:

uint id = zombies.push(Zombie(_name, _dna)) - 1;
zombieToOwner[id] = msg.sender;

Ich hätte kein Problem gehabt, wenn nach der Funktion push() nicht "-1" gewesen wäre. Ich glaube, der Rückgabewert der Push-Funktion hat etwas mit dem Index des eingefügten Objekts zu tun. Warum gibt es eine "-1"? Steht der Rückgabewertindex der nächsten freien Stelle zur Verfügung, um das nächste Objekt in das Array einzufügen?

Antworten (4)

Aus der Solidity-Dokumentation :

push : Dynamische Speicher-Arrays und bytes(nicht string) haben eine Member-Funktion namens push(), die Sie verwenden können, um ein null-initialisiertes Element am Ende des Arrays anzuhängen. Es gibt eine Referenz auf das Element zurück, sodass es wie x.push().t = 2oder verwendet werden kann x.push() = b.

Die Funktion gibt die neue Länge des Arrays zurück. Wenn also bereits 1 Element im Array vorhanden ist und ich ein weiteres pushe, gibt dieser Push die neue Länge zurück, die 2 ist. Da Arrays nullindiziert sind, müssen Sie eins von der Länge subtrahieren, um den Index des letzten Elements zu erhalten , was das von Ihnen gepostete Codebeispiel tut.

Bearbeiten: Wie von @ user8555937 hervorgehoben, gilt dies ab Solidity 0.6.0 nicht mehr. Die Push-Funktion hat keinen Rückgabewert mehr

Dies gilt nicht mehr für solidity 0.6.0: ethereum.stackexchange.com/a/87791/83404

Solidity 0.6.0 enthält einige wichtige Änderungen :

Die Funktion push(value) für Arrays mit dynamischem Speicher gibt nicht mehr die neue Länge zurück (sie gibt nichts zurück).

Die Dokumentation liest sich jetzt wie folgt:

push(x) : Dynamische Speicherarrays und Bytes (keine Zeichenkette) haben eine Mitgliedsfunktion namens push(x), mit der Sie ein bestimmtes Element am Ende des Arrays anhängen können. Die Funktion gibt nichts zurück.

Sie müssen nun die .lengthAttribute verwenden. In deinem Fall :

zombies.push(Zombie(_name, _dna));
uint id = zombies.length - 1;

Die array.push()Funktion ist nur für Speicherarrays mit dynamischer Größe verfügbar. (z. B. können Sie nicht weitermachen array.push(), bytes32[10] arrayda die Größe statisch ist).

In diesen Fällen pushgibt die Funktion die neue Länge des Arrays zurück, sodass der letzte Index immer die Länge -1 hat, da die Indizes bei 0 und nicht bei 1 beginnen;

Sie können es hier überprüfen, wenn Sie möchten: http://solidity.readthedocs.io/en/develop/types.html?highlight=array#members

Ich denke .push(), in den meisten anderen Sprachen bedeutet das wirklich, ein neues Element im Array anzuhängen.

Um die Länge des Arrays zurückzugeben, ist es wirklich sinnvoller, .length.