Menu
Coddy logo textTech

Restrições Múltiplas

Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 41 de 61.

Às vezes, um único limite de trait não é suficiente. Você pode precisar de um tipo genérico que possa tanto ser impresso quanto fornecer um resumo. Rust permite exigir múltiplos traits usando a sintaxe +.

Veja como especificar que um tipo deve implementar duas traits:

use std::fmt::Display;

trait Summary {
    fn summarize(&self) -> String;
}

fn announce<T: Display + Summary>(item: T) {
    println!("Breaking news: {}", item);
    println!("Summary: {}", item.summarize());
}

O limite T: Display + Summary significa que “T deve implementar tanto Display quanto Summary”. Dentro da função, você pode usar recursos de ambas as traits: imprimir com {} (de Display) e chamar summarize() (de Summary).

Você pode encadear quantas traits forem necessárias:

fn process<T: Display + Summary + Clone>(item: T) {
    // Pode imprimir, resumir E clonar
}

Este padrão é essencial quando sua função depende de vários comportamentos. Em vez de aceitar qualquer tipo e esperar que funcione, você declara explicitamente quais recursos são necessários, e o compilador impõe isso em tempo de compilação.

challenge icon

Desafio

Fácil

Vamos criar um sistema de inspeção de produtos que exige que os itens tenham várias capacidades! Você criará uma função genérica que aceita apenas tipos que implementam tanto uma trait personalizada quanto uma trait padrão, demonstrando como a sintaxe + combina vários limites.

Você organizará seu código em dois arquivos:

  • product.rs: Defina uma trait pública Inspectable com um método chamado inspect que recebe &self e retorna uma String contendo os detalhes da inspeção. Em seguida, crie uma struct pública Gadget com os campos públicos name (String) e serial (u32). Seu Gadget deve implementar tanto Inspectable (retornando Inspecting: {name}) quanto std::fmt::Display (formatando como {name} (SN: {serial})). Por fim, crie uma função genérica pública chamada full_report que aceite qualquer tipo T que implemente tanto Display quanto Inspectable. Essa função deve imprimir duas linhas: primeiro o item usando o formatador {} e, em seguida, o resultado da chamada de inspect().
  • main.rs: Inclua seu módulo de produto e crie uma instância de Gadget usando as entradas fornecidas. Chame full_report com seu gadget para mostrar que ele satisfaz os dois requisitos de trait.

O poder de vários limites é que sua função full_report pode usar capacidades de ambas as traits, exibindo o item de forma adequada E obtendo os detalhes da inspeção, tudo garantido em tempo de compilação.

Sua saída deve mostrar tanto o formato de exibição quanto o resultado da inspeção:

{name} (SN: {serial})
Inspecting: {name}

Por exemplo, com as entradas Smartwatch e 98765:

Smartwatch (SN: 98765)
Inspecting: Smartwatch

Você receberá duas entradas: o nome do gadget e o número de série (faça o parse como u32).

Experimente você mesmo

mod product;

use product::{Gadget, full_report};

fn main() {
    // Ler entradas
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut serial_input = String::new();
    std::io::stdin().read_line(&mut serial_input).expect("Failed to read line");
    let serial: u32 = serial_input.trim().parse().expect("Failed to parse serial");
    
    // TODO: Crie uma instância de Gadget com o name e o serial
    
    // TODO: Chame full_report com o seu gadget
}
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