Angenommen a struct Node
und ein Array von Nodes allNodes[]
. Ich war erfolgreich beim Hinzufügen Node
zum Array, aber als ich versuchte, eine removeNode()
Methode zu verwenden (die die delete
Methode in Arrays verwendet), bleibt der Wert von allNodes.length
gleich. Liegt es daran, dass Blockchains „unveränderlich“ sind? Bedeutet unveränderlich nicht, dass eine Transaktion (sogar remove Node()
) nicht rückgängig gemacht werden kann?
Es ist möglich, aber es macht nicht genau das, was Sie (wahrscheinlich) erwarten.
Es signalisiert "keine wichtigen Daten hier" und hilft, die Dinge auf Plattformebene effizient zu halten, aber es reorganisiert das Array nicht auf Anwendungsebene, was bedeutet, dass es nicht alle Elemente über der gelöschten Zeile um eine Zeile nach unten verschiebt. Länge ändert sich nicht.
Unveränderlichkeit wirkt sich hier aus. Egal was wir tun, wir hängen nur an den vorherigen Zustand an. Nichts wird wirklich gelöscht. Sogar die Transaktionen, die die "Zeile" erstellt, aktualisiert und schließlich gelöscht haben, sind Teil der unveränderlichen Historie. Beim „Löschen“ kann es nicht darum gehen, Daten zu löschen, aber es könnte darum gehen, sie neu zu organisieren.
Schau mal hier vorbei: Gibt es gut gelöste und einfache Speichermuster für Solidity?
„Mapped Structs with Delete-enabled Index“ führt eine logische Löschung durch. Dies ist für Situationen geeignet, in denen ein hoher Prozentsatz von Zeilen gelöscht wird und Sie eine Schleife über Garbage vermeiden möchten.
Gebräuchlicher ist das viel einfachere „Mapping with Struct“. Es setzt ein "Bit", um ein logisches Löschen anzuzeigen.
Ich hoffe es hilft.
allNodes.length
Variable manuell zu erhöhen / zu verringern? Wie allNodes.length ++
oder allNodes.length --
...
Richard Horrocks
yobro97
delete
@RichardHorrocks Ich habe bereits erwähnt, dass ich Methode verwende . Das Problem hier ist, wenn ich meine manuell verschiebeNodes
, wenn ich das nächste Mal versuche, ein Element mit derpush
Methode hinzuzufügen, wird es einen Konflikt geben ... weil das letzte Element in der manuellen Methode unverändert bleibt.Rob Hitchens