Capítulo 12: Traits (Comportamentos Compartilhados) 🛡️🔮
Neste capítulo, vamos aprender sobre as Traits (Traços) do Rust. Elas são o equivalente às interfaces ou classes abstratas de outras linguagens, e nos permitem definir comportamentos comuns, com o tema de Classes de RPG!
📖 O que são Traits?
Uma trait diz ao compilador do Rust que um determinado tipo deve ter certas funções. Se um tipo implementa uma trait, ele promete que sabe fazer aquelas ações!
No Rust, não temos herança de classes. Usamos Traits para conseguir o mesmo efeito de polimorfismo!
📖 Exemplo Guiado: O Poder de Atacar
Vamos criar uma trait chamada Atacar e implementá-la para Guerreiro e Mago.
- Crie o arquivo
rpg_traits.rsna pastasrc/:
// Definindo a Trait
trait Atacar {
fn atacar(&self); // Quem implementar deve criar essa função!
}
struct Guerreiro {
nome: String,
}
// Implementando a trait para o Guerreiro
impl Atacar for Guerreiro {
fn atacar(&self) {
println!("{} atacou com a Espada Gigante! ⚔️", self.nome);
}
}
struct Mago {
nome: String,
}
// Implementando a trait para o Mago
impl Atacar for Mago {
fn atacar(&self) {
println!("{} lancou uma Bola de Fogo! 🔥", self.nome);
}
}
fn main() {
let heroi1 = Guerreiro { nome: String::from("Arthur") };
let heroi2 = Mago { nome: String::from("Merlin") };
println!("--- Turno de Batalha ---");
heroi1.atacar();
heroi2.atacar();
}🕹️ Como Executar e Testar no VS Code
- Abra o terminal integrado.
- Compile:
rustc rpg_traits.rs - Execute:
./rpg_traits
Resultado Esperado:
--- Turno de Batalha ---
Arthur atacou com a Espada Gigante! ⚔️
Merlin lancou uma Bola de Fogo! 🔥📊 Ilustração Visual: Traits
A trait serve como um contrato que as structs devem seguir:
classDiagram class Atacar { "<<trait>>" +atacar() } class Guerreiro { +String nome } class Mago { +String nome } Atacar <|.. Guerreiro : implementa Atacar <|.. Mago : implementa
🛠️ Prática Obrigatória 1: Habilidade de Curar
Crie uma trait chamada Curar com a função curar(&self). Implemente essa trait para uma struct Clerigo (exibindo “Clérigo usou magia de cura”) e para uma struct Pocao (exibindo “Você bebeu a poção e recuperou vida”). Teste ambas na main!
🔑 Gabarito de Código
Prática 1: traits_cura.rs
trait Curar {
fn curar(&self);
}
struct Clerigo;
impl Curar for Clerigo {
fn curar(&self) {
println!("Clerigo usou magia de cura! ✨");
}
}
struct Pocao;
impl Curar for Pocao {
fn curar(&self) {
println!("Voce bebeu a pocao e recuperou vida! 🧪");
}
}
fn main() {
let c = Clerigo;
let p = Pocao;
c.curar();
p.curar();
}