Métodos & Funções Associadas
Métodos são funções com um receptor self em um bloco impl. Funções associadas não possuem self - construtores como new são o exemplo familiar.
Receita
struct Rectangle { width: u32, height: u32 }
impl Rectangle {
fn new(width: u32, height: u32) -> Self {
Self { width, height }
}
fn area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let r = Rectangle::new(10, 20);
println!("{}", r.area());
}Quando usar isso: Agrupar comportamento com dados, APIs de construtor (builder APIs) e encapsular invariantes na mutação de structs.
Exemplo Funcional
#[derive(Debug)]
struct Account {
balance: i64,
}
impl Account {
fn open(initial: i64) -> Self {
Self { balance: initial.max(0) }
}
fn deposit(&mut self, amount: i64) {
if amount > 0 { self.balance += amount; }
}
fn balance(&self) -> i64 {
self.balance
}
}
fn main() {
let mut a = Account::open(100);
a.deposit(50);
println!("{:?}", a.balance());
}O que isso demonstra:
opené uma função associada - chamada comoAccount::opendepositmuta através de&mut selfbalancelê através de&self- Invariantes aplicadas dentro dos métodos
Análise Detalhada
Tipos de Receptor
| Receptor | Significado |
|---|---|
&self | Empréstimo imutável |
&mut self | Empréstimo mutável exclusivo |
self | Pega a posse (consumindo) |
&self com padrões #[rustfmt::skip] | Casos avançados raros |
Múltiplos Blocos impl
impl Rectangle { /* métodos */ }
impl Rectangle { /* mais métodos - mescla conceitualmente */ }impl Genérico
impl<T: std::fmt::Display> Pair<T> {
fn show(&self) { println!("{}", self.0); }
}Traits vs. Métodos Inerentes
Métodos inerentes são específicos do tipo. Implementações de traits (impl) fornecem interfaces compartilhadas (Display, etc.).
Armadilhas
- Campos públicos ignoram encapsulamento - Chamadores mutam diretamente. Correção: Tornar campos privados, expor métodos.
- Escolha errada de
selfvs&self- Método consumidor quando empréstimo é suficiente força movimentos (moves). Correção: Usar&selfpor padrão. - Conflito de nome de método com campo -
self.x()vsself.x- namespaces diferentes, mas confuso. Correção: Renomear para clareza. - Esqueceu o alias
Self-Selfrefere-se ao tipo sendo implementado no blocoimplatual. Correção: UsarSelfem construtores que retornam o próprio tipo. - Métodos
asyncprecisam deasync fnem traits com cuidado - Traitsasyncnativos foram estabilizados em versões recentes do Rust. Correção: Seguir a documentação da edição paraasyncem traits.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Funções livres fn f(s: &S) | Comportamento não é central para o tipo | Método expressa a capacidade claramente |
| Implementação de Trait | Interface polimórfica | Apenas um tipo concreto |
Padrão de trait de extensão (extension trait pattern) | Adicionar métodos a tipos estrangeiros | Regra orphan bloqueia impl direto |
Struct de construtor (Builder struct) | Muitos campos opcionais no construtor | new simples é suficiente |
FAQs
Métodos são o mesmo que funções membro em C++?
Semelhante, mas sem ponteiro this - parâmetro self explícito com semântica de posse.
Enums podem ter métodos?
Sim. impl Enum { ... } funciona como structs.
O que é `Self`?
Alias de tipo para o tipo sendo implementado no bloco impl atual.
Constantes associadas?
impl Foo { const BAR: u32 = 1; } - chamada como Foo::BAR.
Encadeamento de métodos (`Method chaining`)?
Retornar &self ou &mut self de setters para fluidez do construtor (ou consumir self).
Privacidade de métodos?
pub fn em struct privada é inútil fora do módulo. A struct deve ser pub para uso externo.
Métodos padrão de traits?
Trait fornece um padrão; método inerente é preferido quando ambos existem - regras de resolução de nome se aplicam.
Nomenclatura de método estático?
Convenção: new, default, from_* para construtores.
Métodos podem ser genéricos?
Sim: fn convert<T>(&self) -> T where ...
Sobrecarga de operador?
Via traits como Add em ops - veja a página de Sobrecarga de Operador.
Relacionados
- Noções Básicas de Structs - formas de struct
- Noções Básicas de Traits - métodos de trait
- Enums - métodos em enums
- Derivando Traits -
implautomáticos
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.