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!
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!"
}
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