O que é uma Trait?
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 29 de 61.
Os genéricos permitem que você escreva código que funcione com qualquer tipo, mas às vezes é necessário garantir que um tipo possa fazer algo específico. É aí que entram as traits.
Um trait define um conjunto de métodos que um tipo deve implementar. Pense nele como um contrato: qualquer tipo que "assina" este contrato promete fornecer o comportamento especificado. Se você já usou interfaces em outras linguagens, os traits têm uma finalidade semelhante.
Veja como você define um trait:
trait Describable {
fn describe(&self) -> String;
}
A palavra-chave trait introduz o trait, seguida por seu nome. Dentro das chaves, você declara as assinaturas dos métodos — apenas o nome, os parâmetros e o 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 recebe uma referência a si mesmo e retorna uma String." O trait não se importa como o método funciona: isso fica a cargo de cada tipo que o implementa.
As traits se tornam poderosas quando vários 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 exclusiva. A trait garante que todos compartilhem esse recurso 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 uma única assinatura de método:summarize(&self) -> String. Lembre-se: em uma definição de trait, você declara apenas a assinatura do método com um ponto e vírgula: sem corpo. Isso informa ao Rust: "qualquer tipo que implemente esta trait deve fornecer um métodosummarizeque retorna umaString."main.rs: Inclua seu módulo de resumo e imprima uma mensagem confirmando que sua trait está definida. Como ainda não aprendemos a implementar traits (essa é a próxima lição!), você simplesmente verificará se sua trait compila corretamente.
Em seu arquivo principal, imprima a seguinte mensagem para confirmar que sua definição de trait é válida:
Summarizable trait defined successfully!Este desafio se concentra exclusivamente na sintaxe de definição de traits: 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á a fazer com que structs implementem esta trait!
Experimente você mesmo
mod summary;
fn main() {
// TODO: Imprima a mensagem de confirmação de que o trait está definido
// Expected output: "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 Programação Orientada a Objetos
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 PlayerPratique por conta própria: Compilador de Rust online