Lição: 036: Deletando de Mapeamentos em Solidity
Mapeamentos são uma das estruturas de dados mais importantes em Solidity, servindo a um propósito semelhante a tabelas hash ou dicionários em outras linguagens de programação. Eles permitem que você associe chaves a valores de forma eficiente. No entanto, entender como gerenciar adequadamente mapeamentos, incluindo como deletar dados deles, é crucial para escrever contratos inteligentes eficientes.
Em Solidity, quando você deleta um par chave-valor de um mapeamento, o valor para aquela chave não é removido completamente; em vez disso, ele é redefinido para seu valor padrão. Por exemplo, se o tipo de valor for um inteiro, deletar uma chave irá redefinir seu valor para 0
. Se o tipo de valor for um tipo de referência, como um struct, a variável será redefinida para uma instância do struct inicializada com zero.
Código de Exemplo
Aqui está um exemplo prático para demonstrar como trabalhar com mapeamentos e deletar entradas deles.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract RegistroEstudantes {
struct Estudante {
string nome;
uint idade;
}
// Mapeamento de um ID para um Estudante
mapping(uint => Estudante) private estudantes;
// Função para adicionar um novo estudante
function adicionarEstudante(uint _id, string memory _nome, uint _idade) public {
estudantes[_id] = Estudante(_nome, _idade);
}
// Função para obter os detalhes de um estudante
function obterEstudante(uint _id) public view returns (string memory nome, uint idade) {
Estudante memory estudante = estudantes[_id];
return (estudante.nome, estudante.idade);
}
// Função para deletar um estudante pelo ID
function deletarEstudante(uint _id) public {
delete estudantes[_id];
}
// Função para verificar se um estudante existe
function estudanteExiste(uint _id) public view returns (bool) {
return bytes(estudantes[_id].nome).length != 0; // Verifica se o nome não está vazio
}
}
Explicação
-
Definição de Struct:
- Definimos um struct
Estudante
com os atributosnome
eidade
.
- Definimos um struct
-
Declaração do Mapeamento:
- O mapeamento
estudantes
relaciona um ID exclusivouint
a um structEstudante
.
- O mapeamento
-
Adicionando um Estudante:
- A função
adicionarEstudante
permite a adição de um novo estudante ao mapeamento, associando seu ID aos seus detalhes.
- A função
-
Recuperando Detalhes do Estudante:
- A função
obterEstudante
busca os detalhes de um estudante dado seu ID.
- A função
-
Deletando um Estudante:
- A função
deletarEstudante
remove um estudante do mapeamento usando a palavra-chavedelete
. Isso redefine os valores para seu estado padrão (uma string vazia paranome
e0
paraidade
).
- A função
-
Verificando Existência:
- A função
estudanteExiste
verifica se o nome de um estudante está definido, que é uma maneira simples de verificar se um estudante existe nos registros.
- A função
Testando o Contrato
Você pode implantar o contrato usando qualquer ambiente de desenvolvimento Ethereum, como Remix ou Hardhat, e testar as funções da seguinte maneira:
- Use
adicionarEstudante(1, "Alice", 20)
para adicionar um estudante. - Chame
obterEstudante(1)
para recuperar os detalhes de Alice. - Chame
deletarEstudante(1)
para deletar o registro de Alice. - Finalmente,
estudanteExiste(1)
deve retornarfalso
, indicando que o registro dela não está mais presente.
Pontos Chave para Lembrar
- Deletar de um mapeamento não remove a entrada; ele redefinirá o valor para seu estado padrão.
- Sempre certifique-se de ter verificações como a função
estudanteExiste
em vigor para gerenciar o estado de forma eficaz. - Mapeamentos não possuem um comprimento ou um método para enumerar suas chaves; você precisará gerenciar informações de estado fora do mapeamento se precisar dessa funcionalidade.
Entender mapeamentos e seu mecanismo de deleção é fundamental em Solidity, levando a um melhor design e gerenciamento de contratos. Boa codificação!