---
title: "E0277: Trait Não Implementado no Rust"
url: "https://rustlang.com.br/erros/e0277-trait-nao-implementado/"
markdown_url: "https://rustlang.com.br/erros/e0277-trait-nao-implementado.MD"
description: "Como resolver o erro E0277 do Rust: o tipo não implementa o trait necessário. Aprenda a usar derive, implementar traits manualmente e entender trait bounds."
date: "2026-02-23"
author: "Equipe Rust Brasil"
---

# E0277: Trait Não Implementado no Rust

Como resolver o erro E0277 do Rust: o tipo não implementa o trait necessário. Aprenda a usar derive, implementar traits manualmente e entender trait bounds.


# E0277: Trait Não Implementado

O erro **E0277** ocorre quando você usa um tipo em um contexto que exige que ele implemente um determinado **trait**, mas ele não implementa. Traits no Rust são semelhantes a interfaces em outras linguagens — definem um conjunto de comportamentos que um tipo deve ter.

## A Mensagem de Erro

```
error[E0277]: `Ponto` doesn't implement `std::fmt::Display`
 --> src/main.rs:8:20
  |
8 |     println!("{}", ponto);
  |                    ^^^^^ `Ponto` cannot be formatted with the default formatter
  |
  = help: the trait `std::fmt::Display` is not implemented for `Ponto`
  = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
```

Outra variação com trait bounds:

```
error[E0277]: the trait bound `MinhaStruct: Clone` is not satisfied
 --> src/main.rs:5:22
  |
5 |     let copia = item.clone();
  |                      ^^^^^ the trait `Clone` is not implemented for `MinhaStruct`
  |
  = help: the following implementations were found:
            <String as Clone>
```

## O Que Significa

No Rust, operações como imprimir (`Display`, `Debug`), comparar (`PartialEq`, `Ord`), copiar (`Clone`, `Copy`) e muitas outras são definidas por **traits**. Os tipos não ganham essas capacidades automaticamente — você precisa implementar os traits necessários.

Os cenários mais comuns:

1. **Tentar imprimir** com `println!("{}", x)` sem implementar `Display`
2. **Tentar debugar** com `println!("{:?}", x)` sem implementar `Debug`
3. **Tentar clonar** com `.clone()` sem implementar `Clone`
4. **Tentar comparar** com `==` sem implementar `PartialEq`
5. **Usar em HashMap** como chave sem implementar `Hash` e `Eq`
6. **Usar em genéricos** com bounds que o tipo não satisfaz

## Código com Erro

```rust
struct Ponto {
    x: f64,
    y: f64,
}

fn main() {
    let p = Ponto { x: 1.0, y: 2.0 };

    // ERRO: Ponto não implementa Display
    println!("{}", p);

    // ERRO: Ponto não implementa Debug
    println!("{:?}", p);

    // ERRO: Ponto não implementa Clone
    let p2 = p.clone();

    // ERRO: Ponto não implementa PartialEq
    let igual = p == p2;
}
```

Com trait bounds em funções genéricas:

```rust
fn imprimir_lista<T: std::fmt::Display>(lista: &[T]) {
    for item in lista {
        println!("{}", item);
    }
}

struct Produto {
    nome: String,
    preco: f64,
}

fn main() {
    let produtos = vec![Produto { nome: "Rust".into(), preco: 0.0 }];
    imprimir_lista(&produtos); // ERRO: Produto não implementa Display
}
```

## Como Resolver

### Solução 1: Usar `#[derive(...)]` para Traits Comuns

O Rust pode gerar automaticamente implementações para vários traits padrão:

```rust
#[derive(Debug, Clone, PartialEq)]
struct Ponto {
    x: f64,
    y: f64,
}

fn main() {
    let p = Ponto { x: 1.0, y: 2.0 };
    println!("{:?}", p);           // Debug funciona
    let p2 = p.clone();           // Clone funciona
    println!("Iguais: {}", p == p2); // PartialEq funciona
}
```

Traits que podem ser derivados automaticamente:
- `Debug` — Formatação de debug `{:?}`
- `Clone` — Cópia explícita com `.clone()`
- `Copy` — Cópia implícita (requer `Clone`)
- `PartialEq` / `Eq` — Comparação com `==`
- `PartialOrd` / `Ord` — Comparação com `<`, `>`
- `Hash` — Para uso em `HashMap` / `HashSet`
- `Default` — Valor padrão com `Default::default()`

### Solução 2: Implementar o Trait Manualmente

Para `Display` e outros traits que não podem ser derivados:

```rust
use std::fmt;

struct Ponto {
    x: f64,
    y: f64,
}

impl fmt::Display for Ponto {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "({}, {})", self.x, self.y)
    }
}

fn main() {
    let p = Ponto { x: 1.0, y: 2.0 };
    println!("{}", p); // Saída: (1, 2)
}
```

Implementação personalizada de `PartialEq`:

```rust
struct Usuario {
    id: u64,
    nome: String,
    email: String,
}

// Comparar apenas pelo ID
impl PartialEq for Usuario {
    fn eq(&self, other: &Self) -> bool {
        self.id == other.id
    }
}
```

### Solução 3: Ajustar Trait Bounds em Genéricos

Se você controla a função genérica, verifique se os bounds são necessários:

```rust
// Se só precisa de Debug, não exija Display
fn imprimir_debug<T: std::fmt::Debug>(item: &T) {
    println!("{:?}", item);
}

// Se precisa de Display, implemente para o tipo
fn imprimir_formatado<T: std::fmt::Display>(item: &T) {
    println!("{}", item);
}
```

### Solução 4: Usar where Clause para Bounds Complexos

```rust
use std::fmt::{Debug, Display};
use std::hash::Hash;

fn processar<T>(item: T)
where
    T: Debug + Display + Clone + Hash,
{
    println!("Debug: {:?}", item);
    println!("Display: {}", item);
}
```

## Traits Mais Exigidos e Como Resolver

| Trait | Para que serve | Como obter |
|---|---|---|
| `Debug` | `{:?}` em println | `#[derive(Debug)]` |
| `Display` | `{}` em println | `impl Display for T` |
| `Clone` | `.clone()` | `#[derive(Clone)]` |
| `Copy` | Cópia implícita | `#[derive(Copy, Clone)]` (todos os campos devem ser Copy) |
| `PartialEq` | `==` e `!=` | `#[derive(PartialEq)]` |
| `Hash` | Chave de HashMap | `#[derive(Hash)]` |
| `Send` | Enviar entre threads | Automático se todos os campos são Send |
| `Sync` | Compartilhar entre threads | Automático se todos os campos são Sync |

## Veja Também

- [E0046: Items Faltando na Implementação](/erros/e0046-items-faltando-impl/)
- [E0308: Tipos Incompatíveis](/erros/e0308-tipos-incompativeis/)
- [E0038: Trait Não Pode Ser Trait Object](/erros/e0038-trait-object-unsafe/)
- [Cheatsheet Rust](/cheatsheet/)
- [Documentação oficial: E0277](https://doc.rust-lang.org/error_codes/E0277.html)
