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.
Desafio
FácilVamos 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 chamadaSummarizablecom 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étodosummarizeque retorna umaString."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!
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!"
}
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
1Métodos e Comportamento
Introdução a Blocos de ImplementaçãoO Parâmetro SelfMétodos MutáveisFunções AssociadasMúltiplos Blocos de ImplementaçãoEncadeamento de MétodosRecapitulação - Ações de Retângulo4Projeto: Pet Virtual
Definindo o PetAlimentando o Pet7Traits Padrão
A Trait DebugA Trait DisplayClone e CopyTraits de IgualdadeRecapitulação - Ponto Imprimível10Projeto: Sistema de Documentos
A Trait DrawComponente de Texto2Encapsulamento e Módulos
Fundamentos de MódulosA Palavra-chave PublicCampos PrivadosGettersSettersRecapitulação - Cofre Seguro5Genéricos
Structs GenéricasMétodos GenéricosMúltiplos Tipos GenéricosFunções GenéricasRecapitulação - Ponto de Coordenada8Traits como Restrições
Sintaxe de Restrições de TraitRestrições MúltiplasA Cláusula WhereRetornando Tipos com TraitsRecapitulação - Impressora Genérica11Padrões de Projeto em Rust
Padrão NewtypeComposiçãoA Trait DropFrom e IntoRecapitulação - Mock de Smart Pointer3Enums Avançados
Enums com DadosMétodos em EnumsCorrespondência de Variantes de DadosO Enum Option RevisitadoRecapitulação - Enum Shape6Definição de Traits
O que é uma Trait?Implementando TraitsImplementações PadrãoSobrescrevendo PadrõesTraits com ParâmetrosRecapitulação - Media Player