Lição: 033: Enums em Solidity
Enums (enumerações) são um recurso no Solidity que permitem que os desenvolvedores definam um tipo personalizado com um conjunto fixo de valores. Isso pode aumentar a legibilidade e a manutenibilidade do código ao usar nomes significativos em vez de números inteiros constantes para representar estados ou categorias.
Nesta aula, vamos explorar como definir e usar enums em Solidity com exemplos.
Definindo um Enum
Um enum é definido usando a palavra-chave enum
, seguida pelo nome do enum e seus possíveis valores entre chaves. Aqui está um exemplo simples:
pragma solidity ^0.8.0;
contract SimpleEnum {
enum Estado { Criado, Ativo, Concluído, Cancelado }
Estado public estadoAtual;
constructor() {
estadoAtual = Estado.Criado; // Estado inicial
}
}
Neste exemplo, definimos um enum chamado Estado
com quatro valores: Criado
, Ativo
, Concluído
, e Cancelado
. Também declaramos uma variável de estado estadoAtual
do tipo Estado
.
Usando Enums
Você pode usar enums em funções para mudar o estado ou para executar lógica condicionalmente com base no estado atual. Aqui está uma extensão do exemplo anterior:
pragma solidity ^0.8.0;
contract Tarefa {
enum Estado { Criado, Ativo, Concluído, Cancelado }
Estado public estadoAtual;
constructor() {
estadoAtual = Estado.Criado; // Estado inicial
}
function ativar() public {
require(estadoAtual == Estado.Criado, "Só é possível ativar uma tarefa que foi criada.");
estadoAtual = Estado.Ativo; // Mudar estado para Ativo
}
function concluir() public {
require(estadoAtual == Estado.Ativo, "Só é possível concluir uma tarefa ativa.");
estadoAtual = Estado.Concluído; // Mudar estado para Concluído
}
function cancelar() public {
require(estadoAtual != Estado.Concluído, "Não é possível cancelar uma tarefa concluída.");
estadoAtual = Estado.Cancelado; // Mudar estado para Cancelado
}
}
Neste exemplo, adicionamos três funções: ativar
, concluir
, e cancelar
. Cada função verifica o estado atual antes de transitar para o próximo estado. As instruções require
garantem que as transições de estado sejam válidas.
Enums e Valores Inteiros
Internamente, os enums são representados como inteiros sem sinal. O primeiro valor no enum tem o valor de 0
, o segundo 1
, e assim por diante. Você pode converter valores de enum para inteiros e vice-versa:
pragma solidity ^0.8.0;
contract IntegerEnum {
enum Estado { Criado, Ativo, Concluído, Cancelado }
Estado public estadoAtual;
constructor() {
estadoAtual = Estado.Criado;
}
function obterEstadoAtualComoInteiro() public view returns (uint) {
return uint(estadoAtual); // Converter enum para inteiro
}
function definirEstado(uint _estado) public {
require(_estado <= uint(Estado.Cancelado), "Valor de estado inválido");
estadoAtual = Estado(_estado); // Converter inteiro de volta para enum
}
}
Neste contrato, adicionamos uma função obterEstadoAtualComoInteiro
que retorna o estado atual como um inteiro. A função definirEstado
permite definir o estado usando um valor inteiro enquanto valida-o.
Conclusão
Nesta aula, introduzimos enums em Solidity, demonstrando como defini-los e usá-los em contratos inteligentes. Os enums melhoram a clareza do código ao substituir inteiros simples por nomes descritivos, tornando mais fácil entender os possíveis estados de um contrato.
À medida que você continua a construir seus contratos inteligentes, considere usar enums sempre que aplicável para melhorar a manutenibilidade e a legibilidade do seu código.