Menu
Coddy logo textTech

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!

challenge icon

Desafio

Fácil

Crie 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 Book com o título fornecido e pages definido como 0

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} pages

Folha 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
}
quiz iconTeste seus conhecimentos

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