Lição: 007: Structs e Enums em Rust
Nesta aula, vamos explorar dois tipos de dados fundamentais em Rust: structs e enums. Esses tipos permitem que você crie estruturas de dados complexas e defina seus próprios tipos, o que pode aumentar muito a expressividade do seu código.
Structs em Rust
Structs são usadas para criar tipos de dados personalizados que permitem agrupar dados relacionados. Uma struct é definida usando a palavra-chave struct
, seguida pelo nome da struct e um bloco que contém seus campos.
Definindo uma Struct
Aqui está um exemplo de definição de uma struct simples.
struct Pessoa {
nome: String,
idade: u32,
}
Neste exemplo, definimos uma struct Pessoa
com dois campos: um nome
do tipo String
e uma idade
do tipo u32
.
Criando uma Instância de uma Struct
Você pode criar uma instância de uma struct usando uma sintaxe semelhante à inicialização de objetos:
fn main() {
let pessoa = Pessoa {
nome: String::from("Alice"),
idade: 30,
};
println!("Nome: {}, Idade: {}", pessoa.nome, pessoa.idade);
}
Neste trecho, criamos uma nova instância de Pessoa
com o nome "Alice" e idade 30, e imprimimos seus campos.
Métodos em Structs
Você pode definir métodos para uma struct usando blocos impl
. Veja como você pode adicionar funcionalidade à nossa struct Pessoa
:
impl Pessoa {
fn cumprimentar(&self) {
println!("Olá, meu nome é {} e eu tenho {} anos.", self.nome, self.idade);
}
}
fn main() {
let pessoa = Pessoa {
nome: String::from("Alice"),
idade: 30,
};
pessoa.cumprimentar();
}
Neste exemplo, definimos um método cumprimentar
que imprime uma mensagem de saudação usando os campos da struct.
Enums em Rust
Enums (abreviação de enumerações) permitem definir um tipo que pode ter várias variantes. Isso é particularmente útil quando você quer representar um valor que pode ser uma de várias opções diferentes.
Definindo um Enum
Aqui está um exemplo de definição de um enum:
enum Direcao {
Norte,
Sul,
Leste,
Oeste,
}
Neste exemplo, definimos um enum Direcao
com quatro variantes possíveis: Norte
, Sul
, Leste
e Oeste
.
Usando Enums
Você pode usar enums em instruções match
para lidar com diferentes casos. Aqui está um exemplo simples:
fn imprimir_direcao(direcao: Direcao) {
match direcao {
Direcao::Norte => println!("Você está indo para o Norte."),
Direcao::Sul => println!("Você está indo para o Sul."),
Direcao::Leste => println!("Você está indo para o Leste."),
Direcao::Oeste => println!("Você está indo para o Oeste."),
}
}
fn main() {
let direcao = Direcao::Leste;
imprimir_direcao(direcao);
}
Neste código, definimos uma função imprimir_direcao
que recebe um enum Direcao
e combina suas variantes para imprimir uma mensagem correspondente.
Enums com Dados
Enums também podem ter dados associados. Isso é particularmente útil quando você quer vincular dados a uma variante. Veja um exemplo:
enum Forma {
Circulo(f64), // Raio
Retangulo(f64, f64), // Largura e Altura
}
fn imprimir_forma(forma: Forma) {
match forma {
Forma::Circulo(raio) => {
println!("Esta é um círculo com raio: {}", raio);
}
Forma::Retangulo(largura, altura) => {
println!("Este é um retângulo com largura: {} e altura: {}", largura, altura);
}
}
}
fn main() {
let circulo = Forma::Circulo(2.5);
let retangulo = Forma::Retangulo(4.0, 5.0);
imprimir_forma(circulo);
imprimir_forma(retangulo);
}
Neste exemplo, definimos um enum Forma
que pode representar tanto um círculo com um raio quanto um retângulo com largura e altura. A função imprimir_forma
combina as variantes do enum e imprime as informações relevantes.
Conclusão
Nesta aula, cobrimos o básico de structs e enums em Rust. Structs permitem criar tipos de dados complexos agrupando dados relacionados, enquanto enums permitem definir tipos que podem ter várias variantes. Ambas as características são fundamentais para escrever um código Rust claro e eficiente.
Continue praticando criando suas próprias structs e enums, e tente construir sistemas mais complexos usando esses tipos de dados!