¿Es posible hacer un mapeo con un Array como clave/valor? ¿Dónde existiría una matriz para cada valor?
De hecho, estoy buscando almacenar estructuras en un mapeo, pero parece que no puedo hacerlo funcionar.
Struct Foo{
uint x
}
mapping(uint => Foo[])foo;
e incluso simplemente mapping([] => uint)foo
/ (uint => [])foo;
no parece funcionar.
algo para que pueda hacer:
foo.1.push(FooInstance)
foo.1[0] = FooInstance
Solidity Doc lee
Los tipos de asignación se declaran como asignación _KeyType => _ValueType, donde _KeyType puede ser casi cualquier tipo excepto una asignación y _ValueType puede ser cualquier tipo, incluidas las asignaciones.
Entonces, ¿la matriz no se considera un tipo de datos en solidez?
Las asignaciones solo pueden usar elementary
tipos ( address
, uint
, bytes
, string
) como claves, y más específicamente cualquier tipo para el que sha3()
esté definido. Esto significa que las estructuras y matrices actualmente no se pueden usar como claves.
mapping(uint => Foo[]) foo;
debería funcionar, y lo hace para mí. Su código tiene algunos errores de sintaxis, que podrían ser el problema ( struct
no debe escribirse en mayúsculas, uint x
necesita un punto y coma)
[]
no es un tipo, necesita algún tipo elemental delante de él, como uint[]
.
A los elementos de las matrices se accede con notación de corchetes, no de puntos.
Este contrato debería funcionar:
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
genérico