Lição: 032: Estruturas em Solidity
Nesta aula, vamos explorar as estruturas em Solidity, uma maneira poderosa de agrupar tipos de dados relacionados em uma única entidade. As estruturas são particularmente úteis nos contratos inteligentes do Ethereum, onde muitas vezes é necessário gerenciar estruturas de dados complexas.
O que é uma Estrutura?
Uma estrutura (abreviação de "estrutura") é um tipo de dado personalizado que permite combinar várias variáveis de diferentes tipos de dados em uma única unidade. Isso ajuda a organizar dados relacionados, tornando seus contratos inteligentes mais claros e fáceis de entender.
Definindo uma Estrutura
Para definir uma estrutura em Solidity, você usa a palavra-chave struct
seguida pelo nome da estrutura e pelas propriedades que ela contém. Aqui está a sintaxe:
struct NomeDaEstrutura {
tipoDeDado1 propriedade1;
tipoDeDado2 propriedade2;
// ... adicione mais propriedades conforme necessário
}
Exemplo: Definindo uma Estrutura
Vamos criar uma estrutura simples para representar um Livro
.
pragma solidity ^0.8.0;
contract Biblioteca {
struct Livro {
string titulo;
string autor;
uint256 anoPublicacao;
bool disponivel;
}
}
Neste exemplo, a estrutura Livro
contém quatro propriedades: titulo
, autor
, anoPublicacao
e disponivel
.
Usando Estruturas
Armazenando Estruturas
Você pode armazenar estruturas em variáveis de estado, arrays ou mapeamentos. Vamos ver como usar nossa estrutura Livro
em um contrato.
pragma solidity ^0.8.0;
contract Biblioteca {
struct Livro {
string titulo;
string autor;
uint256 anoPublicacao;
bool disponivel;
}
Livro[] public livros;
function adicionarLivro(string memory _titulo, string memory _autor, uint256 _anoPublicacao) public {
Livro memory novoLivro = Livro({
titulo: _titulo,
autor: _autor,
anoPublicacao: _anoPublicacao,
disponivel: true
});
livros.push(novoLivro);
}
}
Neste exemplo, temos um array de estruturas Livro
chamado livros
. A função adicionarLivro
nos permite criar uma nova instância de Livro
e adicioná-la ao array livros
.
Acessando Propriedades da Estrutura
Você pode acessar as propriedades de uma estrutura usando a notação de ponto. Vamos adicionar uma função para recuperar os detalhes de um livro pelo seu índice.
pragma solidity ^0.8.0;
contract Biblioteca {
struct Livro {
string titulo;
string autor;
uint256 anoPublicacao;
bool disponivel;
}
Livro[] public livros;
function adicionarLivro(string memory _titulo, string memory _autor, uint256 _anoPublicacao) public {
Livro memory novoLivro = Livro({
titulo: _titulo,
autor: _autor,
anoPublicacao: _anoPublicacao,
disponivel: true
});
livros.push(novoLivro);
}
function obterLivro(uint256 indice) public view returns (string memory, string memory, uint256, bool) {
Livro memory livro = livros[indice];
return (livro.titulo, livro.autor, livro.anoPublicacao, livro.disponivel);
}
}
Na função obterLivro
, recuperamos uma estrutura Livro
do array livros
e retornamos suas propriedades.
Atualizando Propriedades da Estrutura
Você também pode atualizar as propriedades de uma estrutura acessando-as diretamente. Veja como implementar uma função para marcar um livro como indisponível:
pragma solidity ^0.8.0;
contract Biblioteca {
struct Livro {
string titulo;
string autor;
uint256 anoPublicacao;
bool disponivel;
}
Livro[] public livros;
function adicionarLivro(string memory _titulo, string memory _autor, uint256 _anoPublicacao) public {
Livro memory novoLivro = Livro({
titulo: _titulo,
autor: _autor,
anoPublicacao: _anoPublicacao,
disponivel: true
});
livros.push(novoLivro);
}
function marcarComoIndisponivel(uint256 indice) public {
require(indice < livros.length, "Índice do livro fora dos limites");
livros[indice].disponivel = false;
}
}
Na função marcarComoIndisponivel
, usamos a declaração require
para garantir que o índice fornecido esteja dentro dos limites antes de atualizar a propriedade disponivel
do respectivo Livro
.
Conclusão
As estruturas em Solidity fornecem uma maneira poderosa de agrupar dados relacionados a uma entidade comum, tornando seus contratos inteligentes mais fáceis de gerenciar e mais legíveis. Com o conhecimento adquirido nesta aula, você deve ser capaz de criar e manipular estruturas de forma eficaz em seus contratos Solidity.
Boa programação!