Recapitulação - Enum Shape
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 18 de 61.
Desafio
FácilVamos construir uma calculadora de geometria que utiliza um enum para representar diferentes formas, cada uma armazenando suas próprias dimensões. Seu enum Shape demonstrará como um único tipo pode conter diferentes estruturas de dados e fornecer um comportamento unificado por meio de métodos.
Você criará dois arquivos para organizar seu código:
shape.rs: Defina um enumShapepúblico com duas variantes:Circle— contém um únicof64representando o raio (sintaxe de tupla)Rectangle— contém campos nomeados:width(f64) eheight(f64)
areaque use correspondência de padrões (pattern matching) para calcular a área correta com base na variante. Para círculos, use3.14159como π.main.rs: Importe seu módulo shape, crie uma instância de cada variante de forma usando as entradas fornecidas e imprima a área de cada forma.
Seu método area deve retornar um f64. Ao fazer o matching, desestruture cada variante para extrair suas dimensões e aplique a fórmula apropriada:
- Área do círculo:
π × radius² - Área do retângulo:
width × height
Sua saída deve exibir a área de cada forma em sua própria linha, com exatamente uma casa decimal:
Circle area: {area}
Rectangle area: {area}Por exemplo, com um raio de círculo de 5.0 e um retângulo com largura 4.0 e altura 6.0, a saída seria:
Circle area: 78.5
Rectangle area: 24.0Você receberá três entradas: o raio do círculo, a largura do retângulo e a altura do retângulo.
Experimente você mesmo
mod shape;
use shape::Shape;
fn main() {
// Ler as entradas
let mut radius_input = String::new();
std::io::stdin().read_line(&mut radius_input).expect("Failed to read line");
let radius: f64 = radius_input.trim().parse().expect("Invalid number");
let mut width_input = String::new();
std::io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: f64 = width_input.trim().parse().expect("Invalid number");
let mut height_input = String::new();
std::io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: f64 = height_input.trim().parse().expect("Invalid number");
// TODO: Criar uma forma Circle usando o raio (radius)
// TODO: Criar uma forma Rectangle usando largura (width) e altura (height)
// TODO: Imprimir a área de cada forma com uma casa decimal
// Formato: "Circle area: {area}" e "Rectangle area: {area}"
}
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