Médio Rust

Métodos e funções associadas

Enunciado

Crie uma struct Retangulo com campos largura e altura (f64). Implemente uma função associada new que recebe largura e altura e retorna um Retangulo. Implemente métodos area e perimetro. No main, crie um retângulo e imprima sua área e perímetro.

Requisitos

  • A struct Retangulo deve ter os campos largura e altura do tipo f64.
  • A função associada new deve criar e retornar um Retangulo.
  • Os métodos area e perimetro devem calcular e retornar f64.
  • A saída deve mostrar área e perímetro com duas casas decimais.

Código inicial

struct Retangulo {
    largura: f64,
    altura: f64,
}

impl Retangulo {
    // Implemente new, area e perimetro
}

fn main() {
    // Crie um retângulo e imprima area e perimetro
}

Saída esperada

Área: 15.00
Perímetro: 16.00
Ver dica

Para formatar com duas casas decimais, use {:.2} no println!. Lembre-se de que métodos recebem &self.

Mostrar solução
struct Retangulo {
    largura: f64,
    altura: f64,
}

impl Retangulo {
    // Função associada: não recebe self
    fn new(largura: f64, altura: f64) -> Self {
        Retangulo { largura, altura }
    }

    // Método: recebe &self
    fn area(&self) -> f64 {
        self.largura * self.altura
    }

    fn perimetro(&self) -> f64 {
        2.0 * (self.largura + self.altura)
    }
}

fn main() {
    let ret = Retangulo::new(5.0, 3.0);
    println!("Área: {:.2}", ret.area());
    println!("Perímetro: {:.2}", ret.perimetro());
}

Passo a passo

  1. Definimos a struct Retangulo com dois campos f64.
  2. No bloco impl, criamos a função associada new que recebe largura e altura e devolve Self (um Retangulo).
  3. O método area recebe &self e multiplica self.largura por self.altura.
  4. O método perimetro calcula 2.0 * (largura + altura).
  5. No main, chamamos Retangulo::new(5.0, 3.0) para criar a instância.
  6. Imprimimos os resultados formatando com {:.2} para duas casas decimais.

Por que funciona

Funções associadas são chamadas com Tipo::funcao e não têm acesso a uma instância. Métodos recebem &self e podem acessar os campos da instância. Isso separa a criação (construtora) do comportamento.

Erros comuns

  • Esquecer &self no método: fn area() -> f64 não compila porque não há acesso à instância.
  • Usar Self em vez de Retangulo no retorno de new: ambos funcionam, mas Self é mais idiomático.
  • Tentar chamar ret.area sem parênteses: ret.area é uma referência ao método, não o resultado.

Outra forma de resolver

Usar uma struct com campos públicos e criar diretamente: Retangulo { largura: 5.0, altura: 3.0 }. A função new é preferível para validar ou calcular valores.

Saída esperada

Área: 15.00
Perímetro: 16.00