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?
Zuordnungen können nur elementary
Typen ( 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 ( struct
sollte nicht großgeschrieben werden, uint x
benö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;
}
}
jayD
gnerisch