Funções Associadas
Parte da seção Object Oriented Programming 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. Funções que não recebem self como parâmetro são chamadas de funções associadas—elas são associadas ao próprio tipo em vez de qualquer instância específica.
O uso mais comum para funções associadas é a criação de construtores. Por convenção, estas são frequentemente chamadas de new:
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Observe que não há o parâmetro self—esta 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
}
Este padrão fornece uma maneira limpa de inicializar structs com valores padrão ou lógica de validação, mantendo a lógica de criação vinculada à definição do tipo. Você provavelmente já viu essa sintaxe com String::from() — essa também é uma função associada!
Desafio
FácilCrie uma struct 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
Também adicione 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 de saída esperado:
{title} has {pages} pagesFolha de consulta
Funções em um bloco impl que não recebem self como parâmetro são chamadas de funções associadas. Elas são associadas ao próprio tipo, em vez de a qualquer instância específica.
Funções associadas são comumente usadas como construtores, tipicamente chamadas de new:
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Para chamar uma função associada, use a sintaxe :: com o nome do tipo:
let player1 = Player::new(String::from("Alice"));
String::from() é um exemplo de uma função associada que você já usou.
Experimente 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 título e retorna um Book com páginas definidas 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 livro com o título 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 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