0Pricing
Learn Rust Coding · Aula

Limites de traits

Restrinja genéricos com traits.

Limites de traits é uma aula grátis de Learn Rust Coding no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Learn Rust Coding, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Learn Rust Coding inclui 4 aulas no total.

O Que as Restrições de Características Fazem

Uma restrição de característica limita um tipo genérico àqueles que implementam determinada característica. Ela informa ao compilador qual comportamento o tipo garante.

Isso disponibiliza os métodos da característica dentro do código genérico, mantendo a função utilizável com muitos tipos.

Sintaxe de Restrição em Linha

A forma mais simples coloca a restrição logo depois do parâmetro de tipo: T: Trait. Aqui, T precisa implementar Display para poder ser impresso.

Dentro da função, agora você pode chamar qualquer método fornecido por Display.

use std::fmt::Display;

fn show<T: Display>(value: T) {
    println!("value = {}", value);
}

Uma Característica Personalizada

As restrições também funcionam com suas próprias características. Defina uma característica com um método e, depois, restrinja uma função genérica por meio dela.

Esta característica Summary exige um método summarize que retorne uma string.

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

Implementando e Restringindo

Implemente a característica para um tipo; então, uma função com restrição poderá aceitar qualquer tipo que a implemente. A função chama o método da característica sem conhecer o tipo concreto.

Este programa completo imprime um resumo de um Article.

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

struct Article { title: String }

impl Summary for Article {
    fn summarize(&self) -> String {
        format!("Article: {}", self.title)
    }
}

fn notify<T: Summary>(item: &T) {
    println!("{}", item.summarize());
}

fn main() {
    let a = Article { title: String::from("Rust") };
    notify(&a);
}

Combinando Restrições com +

Exija várias características ao mesmo tempo unindo-as com +. Aqui, T precisa implementar tanto Display quanto Clone.

A função então pode imprimir o valor e também cloná-lo.

use std::fmt::Display;

fn process<T: Display + Clone>(value: T) {
    let copy = value.clone();
    println!("{}", copy);
}

impl Trait em Argumentos

A sintaxe impl Trait na posição de um argumento é uma forma abreviada de uma restrição simples. item: &impl Summary significa o mesmo que um parâmetro <T: Summary>.

Ela é concisa para casos com um único argumento, mas oferece menos controle quando você reutiliza o tipo.

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

fn notify(item: &impl Summary) {
    println!("{}", item.summarize());
}

Retornando impl Trait

Você também pode retornar impl Trait para ocultar um tipo concreto, garantindo que ele implemente uma característica. Isso é útil para fechamentos e iteradores.

O chamador sabe apenas que o resultado implementa a característica nomeada.

fn make_adder(n: i32) -> impl Fn(i32) -> i32 {
    move |x| x + n
}

fn main() {
    let add5 = make_adder(5);
    println!("{}", add5(10));
}

Restrições Habilitam Operadores

Operadores correspondem a características: + precisa de Add, == precisa de PartialEq e comparações precisam de PartialOrd. Restringir por essas características permite que o código genérico use os operadores.

Aqui, somar exige que T implemente Add consigo mesmo.

use std::ops::Add;

fn sum<T: Add<Output = T>>(a: T, b: T) -> T {
    a + b
}

Métodos Padrão de Características

Características podem fornecer implementações padrão de métodos. Os tipos que as implementam podem substituí-las ou usar o padrão. Genéricos com restrições usam a implementação que estiver em vigor.

Este Summary tem um summarize padrão que os tipos podem manter sem alterações.

trait Summary {
    fn summarize(&self) -> String {
        String::from("(no summary)")
    }
}

struct Note;
impl Summary for Note {}

Despacho Estático e Dinâmico

Restrições de características usam despacho estático: o compilador escolhe o método exato no momento da compilação por meio da monomorfização. Já dyn Trait usa despacho dinâmico por meio de uma tabela virtual.

As restrições normalmente são mais rápidas; dyn troca velocidade por binários menores e flexibilidade em tempo de execução.

Restrições em Estruturas Genéricas

As restrições de características não se limitam a funções. Você pode exigi-las ao definir uma estrutura, para que todas as instâncias satisfaçam a característica.

Aqui, todo Sortable<T> garante que seus itens possam ser comparados.

struct Sortable<T: PartialOrd> {
    items: Vec<T>,
}

Verificação Rápida

Teste sua compreensão sobre restrições de características.

Recapitulação

Restrições de características limitam tipos genéricos para que o compilador permita os métodos e operadores da característica. Combine características com + e use impl Trait como forma abreviada em argumentos ou retornos.

As restrições fornecem despacho estático sem sobrecarga, ao contrário do despacho dinâmico de dyn Trait.

Perguntas Frequentes

A aula “Limites de traits” é grátis?

Sim — o texto completo de “Limites de traits” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Learn Rust Coding, atualize para CoddyKit PRO. O curso de Learn Rust Coding inclui 4 aulas no total.

O que vou aprender em “Limites de traits”?

Restrinja genéricos com traits. Você pratica Learn Rust Coding com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Learn Rust Coding?

Nenhuma experiência prévia é necessária. Learn Rust Coding no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Limites de traits”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Learn Rust Coding?

Sim. Cada aula de Learn Rust Coding inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Funções genéricas
  2. Structs e enums genéricos
  3. Limites de traits
  4. Cláusulas where e múltiplos limites
← Voltar para Learn Rust Coding