Der Grund für Ihren Fehler liegt darin, dass Sie in Solidität nur Deklarationen außerhalb von Funktionen haben können.
In Ihrem Code deklarieren Sie die Zuordnung und führen dann in einer anderen Operation eine Zuweisung durch, die nur in einer Funktion möglich ist.
Für die anderen Datentypen ist es möglich, die Zuweisung auch während der Initialisierung vorzunehmen, damit es funktioniert.
Zuordnungen können als Hash-Tabellen betrachtet werden, aber es ist anders. In solidity wird ein Mapping von Anfang an mit allen möglichen Schlüsseln initialisiert und der zugehörige Wert des Schlüssels ist der Standardwert für den angegebenen Typ. In Solidität können Sie Schlüsseln also nur neue Werte hinzufügen, und Sie können keine neuen Schlüssel hinzufügen, da sie bereits vorhanden sind.
Zu erwähnen ist auch, dass Sie standardmäßig nicht über eine Zuordnung in Solidity iterieren können. Das hängt wiederum mit dem zusammen, was ich zuvor geschrieben habe. Außerdem können Sie nicht nur die Schlüssel abrufen, für die Sie einige Werte eingerichtet haben, da Sie alle Schlüssel standardmäßig mit Werten eingerichtet haben.
Mappings sind nur am Rande wie Hash-Tabellen und werden völlig anders als jede andere Programmiersprache implementiert. Typischerweise hat eine Hash-Tabelle ein internes Array, das zu 25-75 % mit Schlüsseln/Werten gefüllt ist, die Sie gespeichert haben. Und Sie können darüber iterieren, da Sie in einer nicht-trivialen Tabelle nur höchstens 75 % leere Zellen überspringen. Unterschiede bei Solidity-Mappings:
O(1)
Operationen (aus dem POV des Skripts), nicht O(1+e)
wie die meisten anderen Hash-Tabellen. Es gibt keine Long-Tail-Wachstumskosten, da sich der Tisch niemals ausdehnt und keine O(n)
Kollisionskette läuft.Daher würde ich empfehlen, sie NICHT als Hash-Tabellen zu betrachten. Betrachten Sie sie stattdessen nur als Einwegfunktionen , die einen Zeiger auf eine pseudozufällige Speicheradresse zurückgeben.
Um Mappings zu verstehen, können Sie sie als Hash-Tabellen sehen .
Über Ihren Code kann Ihnen wahrscheinlich jemand anderes eine vollständige Erklärung geben, aber ich denke, das liegt daran, dass Sie den Wert der Zuordnung innerhalb einer Funktion zuweisen müssen, zum Beispiel:
contract Complex{
uint a = 1;
uint b = 3;
mapping(uint => uint) myMap;
function Complex(){
myMap[a] = b;
}
}
Dieses Stück Code macht das Gleiche, fügt aber das myMap[a] = b;
in den Konstruktor ein.
Andi Giga
Jossie Calderon
Jossie Calderon
ValueType
.Dragosb
Jossie Calderon