Quiz 10 - Introdução
1. **Para que servem os Tipos Genéricos (Generics)?**
Para tornar o código mais lento
Para criar funções e tipos que funcionam com múltiplos tipos de dados sem duplicar código
Para gerar números aleatórios
Para gerenciar a memória Stack
> **Explicação**: Generics promovem a reutilização de código mantendo a segurança de tipos.
2. **Qual a sintaxe para declarar uma função genérica com o tipo `T`?**
`fn minha_funcao(T) {}`
`fn minha_funcao(item: T) {}`
`fn minha_funcao(item: Generic T) {}`
`fn minha_funcao() {}`
> **Explicação**: Os colchetes angulares `` após o nome da função definem o parâmetro de tipo.
3. **O que é uma Trait no Rust?**
Um tipo de dado primitivo
Uma definição de comportamento que tipos diferentes podem implementar
Um erro de compilação
Uma forma de herança de classes
> **Explicação**: Traits são similares a interfaces em outras linguagens, definindo "o que um tipo pode fazer".
4. **Qual palavra-chave usamos para implementar uma Trait em um tipo?**
`use`
`impl ... for ...`
`as`
`where`
> **Explicação**: `impl NomeTrait for NomeTipo { ... }` é a estrutura padrão.
5. **O que faz um "Trait Bound"?**
Deleta uma Trait
Restringe um tipo genérico para aceitar apenas tipos que implementam certas Traits
Cria uma nova variável
Aumenta a velocidade do programa
> **Explicação**: Usamos algo como `` para garantir que possamos imprimir o tipo `T`.
6. **A cláusula `where` é usada para:**
Localizar arquivos no disco
Tornar a declaração de múltiplas Trait Bounds mais limpa e organizada
Definir variáveis globais
Iniciar um loop
> **Explicação**: `where` é útil quando temos muitos genéricos com restrições complexas.
7. **Podemos definir implementações padrão de métodos em uma Trait?**
Sim, e tipos que a implementam podem usar o padrão ou sobrescrevê-lo
Não, todos os métodos devem ser vazios
Apenas se a Trait for privada
Apenas para tipos numéricos
> **Explicação**: Implementações padrão reduzem o trabalho necessário para implementar a Trait.
8. **Como usamos uma Trait como parâmetro de uma função de forma simplificada?**
`fn acao(item: Trait)`
`fn acao(item: &impl NomeTrait)`
`fn acao(item: dyn NomeTrait)`
`fn acao(item: Some Trait)`
> **Explicação**: A sintaxe `impl Trait` é um açúcar sintático para Trait Bounds simples.
9. **O que é o "Orphan Rule" (Regra do Órfão)?**
Uma regra sobre variáveis sem dono
Você só pode implementar uma trait em um tipo se a trait OU o tipo foram definidos no seu crate
Uma regra que proíbe o uso de `Result`
Um comando do compilador para remover código morto
> **Explicação**: Isso evita que crates diferentes tentem implementar a mesma trait no mesmo tipo, causando conflitos.
10. **Traits podem ser usadas para definir tipos de retorno?**
Sim, usando a sintaxe `-> impl NomeTrait`
Não, o retorno deve ser um tipo concreto
Apenas se a função for secreta
Somente em macros
> **Explicação**: O retorno `impl Trait` permite esconder o tipo real mas garantir o comportamento.