Mapping mit Array als Datentyp Key Or Value

Ist es möglich, ein Mapping mit einem Array als Schlüssel/Wert durchzuführen? Wo würde für jeden Wert ein Array existieren?

Ich möchte eigentlich Strukturen in einem Mapping speichern, aber es scheint nicht zu funktionieren.

Struct Foo{
uint x
}

mapping(uint => Foo[])foo;und sogar einfach mapping([] => uint)foo/ (uint => [])foo;scheint nicht zu funktionieren.

etwas, damit ich tun kann:

foo.1.push(FooInstance)

foo.1[0] = FooInstance

Solidity Doc liest

Zuordnungstypen werden als Zuordnung _KeyType => _ValueType deklariert, wobei _KeyType fast jeder Typ außer einer Zuordnung sein kann und _ValueType tatsächlich jeder Typ sein kann, einschließlich Zuordnungen.

Werden Arrays also nicht als solider Datentyp betrachtet?

Antworten (1)

Zuordnungen können nur elementaryTypen ( address, uint, bytes, string) als Schlüssel verwenden, und zwar jeden Typ, für den sha3()definiert ist. Das bedeutet, dass Strukturen und Arrays derzeit nicht als Schlüssel verwendet werden können.

mapping(uint => Foo[]) foo;sollte funktionieren, und tut es für mich. Ihr Code enthält einige Syntaxfehler, die möglicherweise das Problem darstellen ( structsollte nicht großgeschrieben werden, uint xbenötigt ein Semikolon).

[]kein Typ ist, brauchen Sie einen elementaren Typ davor, wie uint[].

Auf Elemente in Arrays wird mit Klammernotation zugegriffen, nicht mit Punktnotation.

Dieser Vertrag sollte funktionieren:

contract Bar{

    struct Foo{
        uint x;
    }
    mapping(uint => Foo[]) foo;

    function add(uint id, uint _x) public {
        foo[id].push(Foo(_x));
    }

    function get(uint id, uint index) public returns(uint){
        return foo[id][index].x;
    }
}
Ja, ich habe gerade gemerkt, dass ich hierher gekommen bin, um meine eigene Frage zu beantworten. Vielen Dank für die Hilfe!
Gibt es eine Möglichkeit, das gesamte Array zurückzugeben?