Structs como Parâmetros de Função
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 24 de 66.
Agora que você sabe como criar e modificar structs, vamos explorar como usá-las com funções. Assim como qualquer outro tipo de dado em Rust, você pode passar instâncias de structs para funções e retorná-las de funções.
Para passar uma struct para uma função, você simplesmente a inclui como um parâmetro na definição da função:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}Esta função recebe uma struct Rectangle como parâmetro e retorna um i32. Dentro da função, você pode acessar os campos da struct usando a notação de ponto, assim como faria em qualquer outro lugar.
Você também pode retornar structs de funções especificando o tipo da struct como o tipo de retorno:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}O uso de structs com funções torna seu código mais organizado e significativo. Em vez de passar vários parâmetros individuais, você pode agrupar dados relacionados e passá-los como uma unidade única e bem definida.
Desafio
FácilVocê receberá quatro entradas: a largura de um retângulo (como um número inteiro), a altura de um retângulo (como um número inteiro), o comprimento do lado de um quadrado (como um número inteiro) e um número de escolha (1 ou 2). Defina uma struct Rectangle com dois campos: width: i32 e height: i32. Crie duas funções: uma que recebe um Rectangle e calcula sua área, e outra que recebe um comprimento de lado e retorna um Rectangle representando um quadrado. Com base na escolha informada, calcule e imprima a área apropriada.
Requisitos:
- Defina uma struct
Rectanglecom os campos:width: i32eheight: i32 - Crie uma função
calculate_areaque recebe umRectanglecomo parâmetro e retorna umi32(a área) - Crie uma função
create_squareque recebe umi32(comprimento do lado) como parâmetro e retorna umRectanglecom largura e altura iguais - Leia a primeira entrada e converta-a para
i32para a largura do retângulo - Leia a segunda entrada e converta-a para
i32para a altura do retângulo - Crie uma instância de
Rectanglecom essas dimensões - Leia a terceira entrada e converta-a para
i32para o comprimento do lado do quadrado - Leia a quarta entrada e converta-a para
i32para a escolha (1 ou 2) - Se a escolha for 1: calcule e imprima a área do retângulo
- Se a escolha for 2: crie um quadrado usando
create_square, então calcule e imprima sua área
Entrada:
- Primeira linha: Largura do retângulo como um número inteiro (ex:
8) - Segunda linha: Altura do retângulo como um número inteiro (ex:
5) - Terceira linha: Comprimento do lado do quadrado como um número inteiro (ex:
6) - Quarta linha: Escolha como um número inteiro, sendo 1 ou 2 (ex:
1)
Saída:
- Se a escolha for 1:
Rectangle area: [area] - Se a escolha for 2:
Square area: [area]
Folha de consulta
Structs podem ser passadas para funções como parâmetros e retornadas de funções.
Para passar uma struct para uma função, inclua-a como um parâmetro:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}Para retornar uma struct de uma função, especifique o tipo da struct como o tipo de retorno:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}Dentro de funções, acesse os campos da struct usando a notação de ponto. O uso de structs com funções permite agrupar dados relacionados em vez de passar múltiplos parâmetros individuais.
Experimente você mesmo
use std::io;
// TODO: Defina a struct Rectangle aqui
// TODO: Defina a função calculate_area aqui
// TODO: Defina a função create_square aqui
fn main() {
// Ler a largura do retângulo
let mut width_input = String::new();
io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: i32 = width_input.trim().parse().expect("Invalid input");
// Ler a altura do retângulo
let mut height_input = String::new();
io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: i32 = height_input.trim().parse().expect("Invalid input");
// Ler o comprimento do lado do quadrado
let mut side_input = String::new();
io::stdin().read_line(&mut side_input).expect("Failed to read line");
let side: i32 = side_input.trim().parse().expect("Invalid input");
// Ler a escolha
let mut choice_input = String::new();
io::stdin().read_line(&mut choice_input).expect("Failed to read line");
let choice: i32 = choice_input.trim().parse().expect("Invalid input");
// TODO: Escreva seu código abaixo
// Crie uma instância de Rectangle, verifique a escolha e calcule a área apropriada
// Exibir o resultado com base na escolha
// Use: println!("Rectangle area: {}", area); ou println!("Square area: {}", area);
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fluxo de Controle Avançado
A Expressão 'match'Correspondência de Múltiplos ValoresCorrespondência de IntervalosA Expressão 'if let'Loops como ExpressõesRecapitulação - Parser de Comandos Simples4Agrupando Dados com Structs
O que é uma Struct?Visão Geral de StructsAcessando Campos de uma StructStructs MutáveisStructs como Parâmetros de FunçãoTuple StructsRecapitulação - Criando uma Struct Book2Introdução a Vetores
O que é um Vetor?Criando um VetorAdicionando Elementos com pushAcessando Elementos do VetorIterando sobre um VetorIteração MutávelRemovendo ElementosRecapitulação - Rastreador de Pontuação Básico5Pares Chave-Valor com Hash Maps
O que é um Hash Map?Criando um Hash MapInserindo Pares Chave-ValorAcessando ValoresIterando sobre um Hash MapAtualizando um ValorRemovendo um ParRecapitulação - Contador de Palavras8Projeto: Inventário Simples de Itens
Configuração do ProjetoAdicionando um ItemVerificando o EstoqueVendendo um ItemJuntando tudo3Lista de Tarefas via Linha de Comando
Configuração do ProjetoAdicionando uma TarefaVisualizando Todas as TarefasRemovendo uma TarefaCódigo Final