Struct para PolĂgono
Vamos criar um struct Polygon
que contém alguns Points
. Copie o código abaixo em https://play.rust-lang.org/ e preencha os métodos que faltam para fazer os testes passarem:
// TODO: remova isto quando vocĂȘ terminar sua implementação . #![allow(unused_variables, dead_code)] pub struct Point { // adicione atributos } impl Point { // adicione mĂ©todos } pub struct Polygon { // adicione atributos } impl Polygon { // adicione mĂ©todos } pub struct Circle { // adicione atributos } impl Circle { // adicione mĂ©todos } pub enum Shape { Polygon(Polygon), Circle(Circle), } #[cfg(test)] mod tests { use super::*; fn round_two_digits(x: f64) -> f64 { (x * 100.0).round() / 100.0 } #[test] fn test_point_magnitude() { let p1 = Point::new(12, 13); assert_eq!(round_two_digits(p1.magnitude()), 17.69); } #[test] fn test_point_dist() { let p1 = Point::new(10, 10); let p2 = Point::new(14, 13); assert_eq!(round_two_digits(p1.dist(p2)), 5.00); } #[test] fn test_point_add() { let p1 = Point::new(16, 16); let p2 = p1 + Point::new(-4, 3); assert_eq!(p2, Point::new(12, 19)); } #[test] fn test_polygon_left_most_point() { let p1 = Point::new(12, 13); let p2 = Point::new(16, 16); let mut poly = Polygon::new(); poly.add_point(p1); poly.add_point(p2); assert_eq!(poly.left_most_point(), Some(p1)); } #[test] fn test_polygon_iter() { let p1 = Point::new(12, 13); let p2 = Point::new(16, 16); let mut poly = Polygon::new(); poly.add_point(p1); poly.add_point(p2); let points = poly.iter().cloned().collect::<Vec<_>>(); assert_eq!(points, vec![Point::new(12, 13), Point::new(16, 16)]); } #[test] fn test_shape_perimeters() { let mut poly = Polygon::new(); poly.add_point(Point::new(12, 13)); poly.add_point(Point::new(17, 11)); poly.add_point(Point::new(16, 16)); let shapes = vec![ Shape::from(poly), Shape::from(Circle::new(Point::new(10, 20), 5)), ]; let perimeters = shapes .iter() .map(Shape::perimeter) .map(round_two_digits) .collect::<Vec<_>>(); assert_eq!(perimeters, vec![15.48, 31.42]); } } #[allow(dead_code)] fn main() {}
Como as assinaturas dos mĂ©todos estĂŁo faltando nas declaraçÔes do problema, a parte principal do exercĂcio Ă© especificĂĄ-las corretamente. NĂŁo Ă© preciso modificar os testes.
Outras partes interessante do exercĂcio:
- Derive um trait
Copy
para algumas structs, jå que em testes os métodos às vezes não emprestam seus argumentos. - Descubra que o trait
Add
deve ser implementado para que dois objetos sejam adicionados via â+â. Note que nĂłs nĂŁo discutimos generics atĂ© o Dia 3.