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?
Aus der Solidity-Dokumentation :
push : Dynamische Speicher-Arrays und
bytes
(nichtstring
) haben eine Member-Funktion namenspush()
, 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 wiex.push().t = 2
oder verwendet werden kannx.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
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 .length
Attribute 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] array
da die Größe statisch ist).
In diesen Fällen push
gibt 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
.
Benutzer8555937