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
Retangulodeve ter os camposlarguraealturado tipo f64. - A função associada
newdeve criar e retornar umRetangulo. - Os métodos
areaeperimetrodevem 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
- Definimos a struct
Retangulocom dois camposf64. - No bloco
impl, criamos a função associadanewque recebe largura e altura e devolveSelf(umRetangulo). - O método
arearecebe&selfe multiplicaself.larguraporself.altura. - O método
perimetrocalcula2.0 * (largura + altura). - No
main, chamamosRetangulo::new(5.0, 3.0)para criar a instância. - 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
&selfno método:fn area() -> f64não compila porque não há acesso à instância. - Usar
Selfem vez deRetangulono retorno denew: ambos funcionam, masSelfé mais idiomático. - Tentar chamar
ret.areasem 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