Menu
Coddy logo textTech

O que é uma Trait?

Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 29 de 61.

Genéricos permitem que você escreva código que funciona com qualquer tipo, mas às vezes você precisa garantir que um tipo possa fazer algo específico. É aqui que as traits entram.

Uma trait define um conjunto de métodos que um tipo deve implementar. Pense nisso como um contrato — qualquer tipo que "assine" este contrato promete fornecer o comportamento especificado. Se você já usou interfaces em outras linguagens, as traits servem a um propósito semelhante.

Veja como você define uma trait:

trait Describable {
    fn describe(&self) -> String;
}

A palavra-chave trait introduz a trait, seguida pelo seu nome. Dentro das chaves, você declara as assinaturas dos métodos — apenas o nome, parâmetros e tipo de retorno, sem corpo. O ponto e vírgula após a assinatura indica que isso é um requisito, não uma implementação.

Este trait Describable diz: "Qualquer tipo que me implemente deve fornecer um método describe que receba uma referência a si mesmo e retorne uma String." O trait não se importa como o método funciona — isso depende de cada tipo que o implementa.

Traits tornam-se poderosas quando múltiplos tipos diferentes implementam a mesma trait. Um Book, um Car e uma Person poderiam todos ser Describable, cada um fornecendo sua própria descrição única. A trait garante que todos eles compartilhem essa capacidade comum.

challenge icon

Desafio

Fácil

Vamos definir sua primeira trait! Uma trait estabelece um contrato — uma promessa de que qualquer tipo que a implemente fornecerá um comportamento específico. Você criará uma trait Summarizable que diferentes tipos podem implementar para fornecer um resumo de si mesmos.

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

  • summary.rs: Defina uma trait pública chamada Summarizable com a assinatura de um único método: summarize(&self) -> String. Lembre-se, em uma definição de trait você apenas declara a assinatura do método com um ponto e vírgula — sem corpo. Isso diz ao Rust "qualquer tipo que implementar esta trait deve fornecer um método summarize que retorna uma String."
  • main.rs: Importe seu módulo summary e imprima uma mensagem confirmando que sua trait foi definida. Como ainda não aprendemos como implementar traits (essa é a próxima lição!), você simplesmente verificará se sua trait compila corretamente.

No seu arquivo principal, imprima a seguinte mensagem para confirmar que a definição da sua trait é válida:

Summarizable trait defined successfully!

Este desafio foca puramente na sintaxe de definição de trait — a palavra-chave trait, o nome da trait e a declaração de assinaturas de métodos sem implementações. Na próxima lição, você aprenderá como fazer structs implementarem esta trait!

Folha de consulta

Uma trait define um conjunto de métodos que um tipo deve implementar. Ela age como um contrato que garante que um tipo forneça um comportamento específico.

Para definir uma trait, use a palavra-chave trait seguida pelo nome da trait e pelas assinaturas dos métodos:

trait Describable {
    fn describe(&self) -> String;
}

As assinaturas de método em traits incluem o nome, parâmetros e tipo de retorno, mas sem corpo. O ponto e vírgula indica que isso é um requisito para os tipos que a implementam.

Múltiplos tipos diferentes podem implementar a mesma trait, cada um fornecendo sua própria implementação dos métodos exigidos.

Experimente você mesmo

mod summary;

fn main() {
    // TODO: Imprima a mensagem de confirmação de que a trait está definida
    // Saída esperada: "Summarizable trait defined successfully!"
    
}
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