Menu
Coddy logo textTech

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!

challenge icon

Desafio

Fácil

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

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

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 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
}
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 Programação Orientada a Objetos

Pratique por conta própria: Compilador de Rust online