Aquí está el código:
pragma solidity^0.4.16;
contract Test {
struct SomeData {
address[] users;
}
address[] nullArray;
mapping(uint => SomeData) SomeDataList;
function insertData(uint number) {
SomeDataList[number] = SomeData({
users : nullArray
});
SomeDataList[number].users.push(msg.sender);
}
}
En insertData
la función, inicializo una nueva estructura y la asigno nullArray
al users
campo ( ¿ users
ahora almaceno una copia nullArray
o un puntero a él?). Después de eso, envío algunos datos a esta estructura y no estoy seguro de si la variable global nullArray
se verá afectada o no.
¿Los usuarios ahora almacenan una copia de nullArray o un puntero a él?
Creará una copia independiente. Según tengo entendido, dado que ambos nullArray
y SomeDataList
son variables de estado, habrá dos copias independientes.
Se menciona en los documentos de solidez aquí que,
las asignaciones entre almacenamiento y memoria y también a una variable de estado ( incluso de otras variables de estado ) siempre crean una copia independiente.
por eso,
Empujé algunos datos a esta estructura y no estoy seguro de si la variable global nullArray se verá afectada o no.
nullArray
no se verá afectado.
ACTUALIZAR
Probé su código con algunas funciones adicionales en Remix-IDE de la siguiente manera,
pragma solidity^0.4.16;
contract Test {
struct SomeData {
address[] users;
}
address[] nullArray;
mapping(uint => SomeData) SomeDataList;
function insertData(uint number) {
SomeDataList[number] = SomeData({
users : nullArray
});
SomeDataList[number].users.push(msg.sender);
}
function getusers(uint number) constant returns(address []){
return SomeDataList[number].users;
}
function getNullArray() constant returns(address[]){
return nullArray;
}
function pushNullArray(address addr){
nullArray.push(addr);
}
}
Y nullArray
y SomeDataList
actuaron como dos variables diferentes. Estos son los resultados de la llamada a la función después de la llamada pushNullArray(address addr)
y insertData(uint number)
con algunos valores arbitrarios.
No eran lo mismo.
¡Espero que esto ayude!
Crea una copia. Aunque nullArray
& users
here son tipos de referencia de almacenamiento, la asignación a variables de estado siempre hace una copia.
30mb1