Getters
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 11 de 61.
Com campos privados, o código externo não pode acessar os dados da sua struct diretamente. Mas às vezes você precisa permitir que outros leiam os dados sem dar a eles a capacidade de alterá-los. É aqui que entram os métodos getter.
Um getter é simplesmente um método público que retorna uma referência a um campo privado:
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
O método balance() recebe &self (acesso de apenas leitura) e retorna o valor do campo privado. Em Rust, os getters são tipicamente nomeados com o nome do próprio campo — nenhum prefixo get_ é necessário.
Agora o código externo pode ler o saldo através do método:
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance()); // Funciona!
}
Para campos que contêm dados de propriedade como String, você frequentemente retornará uma referência para evitar cópias desnecessárias:
pub fn name(&self) -> &String {
&self.name
}
Getters fornecem acesso de leitura controlado enquanto mantêm o próprio campo protegido. A struct permanece no controle de seus dados — o código externo pode olhar, mas não pode tocar.
Desafio
FácilVamos construir um sistema de perfil de usuário que demonstra como os métodos getter fornecem acesso de leitura controlado a dados privados.
Você criará dois arquivos para organizar seu código:
profile.rs: Defina uma structUserProfilecom dois campos privados:username(String) eage(u32). A struct em si deve ser pública, mas os campos devem permanecer privados. Implemente um construtornewpúblico que receba um username e uma age. Em seguida, adicione dois métodos getter:username— retorna uma referência ao username (&String)age— retorna o valor da age (u32)
main.rs: Importe seu módulo profile, crie umUserProfilee use os métodos getter para imprimir as informações do usuário.
Lembre-se de que os getters em Rust são normalmente nomeados com o próprio nome do campo — nenhum prefixo get_ é necessário. Para campos String, retorne uma referência para evitar cópias desnecessárias.
Sua saída deve seguir este formato exato:
Username: {username}
Age: {age}Por exemplo, se você criar um perfil com o username "alice" e age 25, a saída seria:
Username: alice
Age: 25Você receberá duas entradas: o username e a age.
Folha de consulta
Um método getter é um método público que fornece acesso de apenas leitura a um campo privado.
Getters permitem que o código externo visualize os dados sem poder modificá-los diretamente:
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
Em Rust, os getters são nomeados com o próprio nome do campo — nenhum prefixo get_ é necessário.
Para campos que contêm dados de propriedade (owned data) como String, retorne uma referência para evitar cópias desnecessárias:
pub fn name(&self) -> &String {
&self.name
}
Usando um método getter:
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance());
Experimente você mesmo
mod profile;
use profile::UserProfile;
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let age: u32 = input2.trim().parse().expect("Failed to parse age");
// TODO: Criar um UserProfile usando o construtor
// TODO: Usar os métodos getter para imprimir o nome de usuário e a idade
// Formato:
// Username: {username}
// Age: {age}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Métodos e Comportamento
Introdução a Blocos de ImplementaçãoO Parâmetro SelfMétodos MutáveisFunções AssociadasMúltiplos Blocos de ImplementaçãoEncadeamento de MétodosRecapitulação - Ações de Retângulo4Projeto: Pet Virtual
Definindo o PetAlimentando o Pet7Traits Padrão
A Trait DebugA Trait DisplayClone e CopyTraits de IgualdadeRecapitulação - Ponto Imprimível10Projeto: Sistema de Documentos
A Trait DrawComponente de Texto2Encapsulamento e Módulos
Fundamentos de MódulosA Palavra-chave PublicCampos PrivadosGettersSettersRecapitulação - Cofre Seguro5Genéricos
Structs GenéricasMétodos GenéricosMúltiplos Tipos GenéricosFunções GenéricasRecapitulação - Ponto de Coordenada8Traits como Restrições
Sintaxe de Restrições de TraitRestrições MúltiplasA Cláusula WhereRetornando Tipos com TraitsRecapitulação - Impressora Genérica11Padrões de Projeto em Rust
Padrão NewtypeComposiçãoA Trait DropFrom e IntoRecapitulação - Mock de Smart Pointer3Enums Avançados
Enums com DadosMétodos em EnumsCorrespondência de Variantes de DadosO Enum Option RevisitadoRecapitulação - Enum Shape6Definição de Traits
O que é uma Trait?Implementando TraitsImplementações PadrãoSobrescrevendo PadrõesTraits com ParâmetrosRecapitulação - Media Player