Ist es möglich, eine Karte als Zuordnungswert zuzuweisen

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?

Antworten (1)

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.

publicDies 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.

Vielen Dank für einen Blick. Leider frage ich mich eher, ob ich eine Karte einer Karte zuweisen kann. Anstelle von mapIndex[a][b][c]=[d] möchte ich mapIndex[a]=otherMap ausführen (wobei für andere Karten bereits [b][c][d]-Werte festgelegt sind). Obwohl es so aussieht, als würde ich am Ende nur meine früheren Karten überarbeiten, um von Anfang an Teil dieser Superkarte zu sein
Die Zustandsvariablen beschreiben, wie die Speicherung organisiert wird. Sie möchten nicht wirklich, dass sich große Strukturen bewegen (dh map[a] on the fly mit othermap füllen. Das klingt teuer. Sie möchten den gewünschten Effekt im Voraus festlegen, damit sich nichts bewegen muss. Ich bin mir nicht sicher, ob es klar ist dass jeder Schlüssel in der ersten Karte auf eine eigene Karte verweist. Möglicherweise suchen Sie nach einem anderen Effekt. Was versuchen Sie zu lösen?
Ich versuche wirklich nur, langsamer auszurollen und alle diese Karten zu einer Karte zu machen, da sie in der gesamten Codebasis verwendet werden. Scheint aber, als müsste ich alles auf einmal machen.