pragma solidity ^0.4.24;
contract User {
mapping(uint=>address) addresses;
uint addressRegistryCount;
function set(address userAddress) public {
addresses[addressRegistryCount] = userAddress;
addressRegistryCount++;
}
function get(address userAddress) public view returns (uint) {
for (uint i = 0; i <= addressRegistryCount; i++) {
if(addresses[i] == userAddress)
return i;
}
}
/*function getAll() {
}*/
}
En este contrato tengo una función llamada getAll. Dentro de esa función, intento devolver el mapeo completo de los usuarios. ¿Cómo puedo hacer eso?
No puede devolver un mapping
directamente. Lo que puede hacer es crear una matriz y agregarle todos address
los valores almacenados en la addresses
asignación. Luego devuelva esa matriz.
function getAll() public view returns (address[] memory){
address[] memory ret = new address[](addressRegistryCount);
for (uint i = 0; i < addressRegistryCount; i++) {
ret[i] = addresses[i];
}
return ret;
}
mapping
, siempre que asigne tipos de longitud fija (y en el ejemplo anterior, uint
y address
son tales).En lugar de una asignación, puede devolver 2 matrices. Echa un vistazo a este ejemplo de trabajo...
function getAvailableMintsForUser(WhitelistStorage storage self) public view returns (uint256[] memory, uint8[] memory) {
uint256 balance = self.contract.balanceOf(msg.sender);
uint256[] memory tokenIds = new uint256[](balance);
uint8[] memory available = new uint8[](balance);
for(uint256 i = 0 ; i < balance ; i++) {
tokenIds[i] = self.chroma.tokenOfOwnerByIndex(msg.sender, i);
available[i] = calcAvailableMintsPerTokenId(self, tokenIds[i]);
}
return (tokenIds, available);
}
buena vibración
public
beforeaddresses
y obtendrá una función "getAll" (que puede invocar desde fuera de la cadena a través deaddresses()
).saman.shahmohamadi
public
identificador no da como resultado unagetAll
función. Le brinda una función pública que toma el índice como entrada y devuelve solo un elemento de mapeo.saman.shahmohamadi