Im Wesentlichen habe ich mehrere Zuordnungen, auf die ich gelegentlich gerne mit einer Zeichenfolge oder einem bytes32-Wert zugreifen könnte, aber meistens direkt zugreifen
mapping(int256 => mapping(int256 => address)) public mapOfA;
mapping(int256 => mapping(int256 => address)) public mapOfB;
mapping(int256 => mapping(int256 => address)) public mapOfC;
Ich möchte abhängig von einer Variablen (entweder Zeichenfolge oder Bytes32) auf eine dieser Zuordnungen zugreifen können.
Ich habe versucht:
mapping(string => mapping(int256 => mapping(int256 => address)) public mapIndex;
Wenn ich versuche einzustellen:
mapIndex["A"] = mapOfA;
Ich bekomme folgenden Fehler:
Error: Mappings cannot be assigned to.
mapIndex["A"]
Übersehe ich etwas oder ist es nicht möglich, eine Karte als Zuordnungswert zuzuweisen?
Kannst du machen, aber...
Zunächst benötigen Sie eine andere )
, um dies zu kompilieren. Dann bekommst du:
mapping(string => mapping(int256 => mapping(int256 => address))) public mapIndex;
... und Sie müssen fallen public
.
public
Dies ist nicht offensichtlich, aber Sie erhalten vom Compiler eine "nicht implementierte Funktion", da er den vom Modifikator angeforderten "freien" Getter nicht erstellen kann .
Das kompiliert:
mapping(string => mapping(int256 => mapping(int256 => address))) mapIndex;
Die Aufgabe, die der Compiler nicht für Sie übernimmt, besteht darin, einen Getter mit drei Argumenten zu erstellen, um den Weg zu einem bestimmten Element zu finden. Du kannst
pragma solidity ^0.4.19;
contract Nested {
mapping(string => mapping(int256 => mapping(int256 => address))) mapIndex;
function getMapIndex(string a, int256 b, int256 c) public view returns(address d) {
return mapIndex[a][b][c];
}
function setMapIndex(string a, int256 b, int256 c, address d) public returns(bool success) {
mapIndex[a][b][c] = d;
return true;
}
}
Ich hoffe es hilft.
ExperimentemitCode
Rob Hitchens
ExperimentemitCode