Funções Associadas
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 4 de 61.
Nem todas as funções em um bloco impl precisam operar em uma instância existente. As funções que não recebem self como parâmetro são chamadas de funções associadas: elas estão associadas ao próprio tipo, e não a nenhuma instância específica.
O uso mais comum para funções associadas é criar construtores. Por convenção, eles geralmente são nomeados como new:
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Observe que não há um parâmetro self. Essa função não precisa de um Player existente para funcionar. Em vez disso, ela cria e retorna um novo. O tipo de retorno é a própria struct.
Para chamar uma função associada, use a sintaxe :: com o nome do tipo em vez da notação de ponto:
fn main() {
let player1 = Player::new(String::from("Alice"));
println!("{} starts with {} points", player1.name, player1.score);
// Saída: Alice começa com 0 pontos
}
Esse padrão oferece uma maneira organizada de inicializar structs com valores padrão ou lógica de validação, mantendo a lógica de criação agrupada com a definição do tipo. Você provavelmente já viu essa sintaxe com String::from(): essa também é uma função associada!
Desafio
FácilCrie uma estrutura Book com dois campos: title (String) e pages (u32).
Adicione um bloco de implementação para Book com uma função associada chamada new que:
- Recebe um parâmetro
title: String - Retorna um novo
Bookcom o título fornecido epagesdefinido como0
Adicione também um método chamado info que recebe &self e retorna uma String no formato: "{title} has {pages} pages"
Você receberá uma entrada:
- O título do livro (String)
Use a função associada Book::new para criar um livro com o título fornecido e, em seguida, imprima o resultado da chamada do método info.
Formato esperado da saída:
{title} has {pages} pagesExperimente você mesmo
use std::io;
// TODO: Defina a struct Book com os campos title (String) e pages (u32)
// TODO: Adicione um bloco impl para Book com:
// - Uma função associada `new` que recebe um title e retorna um Book com pages definido como 0
// - Um método `info` que retorna uma String no formato "{title} has {pages} pages"
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let title = input.trim().to_string();
// TODO: Use Book::new para criar um book com o title fornecido
// TODO: Imprima o resultado da chamada do método info
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
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 PlayerPratique por conta própria: Compilador de Rust online