O Parâmetro Self
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 2 de 61.
Quando um método precisa acessar os dados armazenados em uma instância de struct, ele usa o parâmetro &self. Este parâmetro especial é sempre o primeiro argumento em um método e representa uma referência à instância na qual o método é chamado.
O símbolo & significa que estamos pegando a instância emprestada em vez de assumir a posse (ownership) dela. Isso permite que o método leia os campos da struct sem consumir a instância:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
Dentro do corpo do método, self fornece acesso a todos os campos da struct usando a notação de ponto. O método area lê tanto width quanto height para calcular e retornar o resultado.
Como o &self apenas empresta a instância, você pode chamar múltiplos métodos na mesma struct sem problemas:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
Métodos que usam &self são de apenas leitura—eles podem examinar os dados da struct, mas não podem alterá-los. Na próxima lição, você aprenderá como criar métodos que podem modificar a instância.
Desafio
FácilCrie uma struct Circle com um único campo: radius (f64).
Adicione um bloco de implementação para Circle com dois métodos que usam &self:
circumference— retorna a circunferência comof64(fórmula:2.0 * 3.14159 * radius)diameter— retorna o diâmetro comof64(fórmula:2.0 * radius)
Você receberá uma entrada:
- O raio do círculo (f64)
Crie uma instância de Circle com o raio fornecido, então imprima a circunferência e o diâmetro em linhas separadas.
Formato de saída esperado:
{circumference}
{diameter}Folha de consulta
Os métodos acessam os dados da struct usando o parâmetro &self, que deve ser o primeiro argumento. O símbolo & significa que o método empresta a instância em vez de assumir a posse (ownership):
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
Dentro do método, use self com a notação de ponto para acessar os campos da struct. Métodos com &self são apenas de leitura e podem examinar os dados, mas não modificá-los.
Como o &self apenas empresta a instância, você pode chamar múltiplos métodos na mesma struct:
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
Experimente você mesmo
use std::io;
// TODO: Defina a struct Circle aqui
// TODO: Adicione o bloco de implementação para Circle com os métodos circumference e diameter
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: Crie uma instância de Circle e imprima a circunferência e o diâmetro
}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