Recapitulação - Ponto de Coordenada
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 28 de 61.
Desafio
FácilVamos construir um sistema de coordenadas flexível que funcione com qualquer tipo numérico! Você criará uma struct Point genérica que pode representar posições usando inteiros para jogos baseados em grade ou números de ponto flutuante para gráficos precisos — tudo a partir de uma única definição.
Você organizará seu código em dois arquivos:
point.rs: Defina uma structPoint<T>genérica pública com dois campos públicos:xey, ambos do tipoT. Implemente métodos para o seu ponto:- Uma função associada
newque cria um ponto a partir das coordenadas x e y - Um método
translateque recebe valores dx e dy e retorna um novoPointcom as coordenadas deslocadas por esses valores (isso exige queTsuporte adição e cópia, portanto use a restriçãoT: std::ops::Add<Output = T> + Copy)
- Uma função associada
main.rs: Importe seu módulo point e demonstre como a mesma struct genérica funciona perfeitamente com diferentes tipos numéricos.
No seu arquivo principal, demonstre seu Point genérico:
- Criando um ponto inteiro usando as duas primeiras entradas (analisadas como
i32) - Traduzindo-o pela terceira e quarta entradas (também
i32) - Criando um ponto de ponto flutuante usando a quinta e sexta entradas (analisadas como
f64) - Exibindo todos os três pontos
Sua saída deve seguir este formato:
Integer point: ({x}, {y})
After translation: ({x}, {y})
Float point: ({x}, {y})Por exemplo, com as entradas 3, 5, 2, -1, 1.5 e 2.5:
Integer point: (3, 5)
After translation: (5, 4)
Float point: (1.5, 2.5)Observe como Point::new(3, 5) cria um Point<i32> enquanto Point::new(1.5, 2.5) cria um Point<f64> — a mesma definição de struct se adapta a ambos!
Você receberá seis entradas: dois inteiros para o primeiro ponto, dois inteiros para a tradução e dois floats para o segundo ponto.
Experimente você mesmo
mod point;
use point::Point;
fn main() {
// Ler as entradas
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let x1: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let y1: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let dx: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let dy: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let x2: f64 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let y2: f64 = input.trim().parse().expect("Invalid input");
// TODO: Criar um ponto inteiro usando x1 e y1
// TODO: Transladar o ponto inteiro por dx e dy
// TODO: Criar um ponto de ponto flutuante usando x2 e y2
// TODO: Imprimir os resultados no formato exigido:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}
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