Funções e expressões

RustBeginner
Pratique Agora

Introdução

Uma função dá um nome a uma tarefa para que o programa possa executá-la sempre que necessário. As funções podem receber dados de entrada por meio de parâmetros e retornar um valor calculado.

Neste laboratório, um projeto Cargo preparado já contém três funções de conversão e todas as chamadas a elas. Você substituirá uma expressão de espaço reservado em cada etapa. Isso mantém a quantidade de código pequena e mostra como definições de funções, parâmetros, tipos de retorno, expressões e chamadas se relacionam.

Retornar um valor de uma função

Nesta etapa, você completará uma função que converte minutos em segundos e relacionará sua definição à chamada correspondente.

Entre no projeto preparado e abra o arquivo-fonte:

cd /home/labex/project/conversion-tool
nano src/main.rs

No início do arquivo, esta linha inicia uma definição de função:

fn minutes_to_seconds(minutes: i32) -> i32 {
  • fn introduz uma função.
  • minutes_to_seconds é o nome da função.
  • minutes: i32 é um parâmetro: uma entrada chamada minutes cujo tipo é o tipo inteiro i32.
  • -> i32 indica que a função retorna um valor i32.
  • As chaves contêm o corpo da função.

O Rust verifica cada chamada com base nessa assinatura. Quem chama a função deve fornecer a quantidade esperada de argumentos, na ordem declarada, e cada argumento deve ter um tipo compatível.

Substitua somente o 0 antes do comentário da Etapa 1 por:

    minutes * 60 // Step 1: replace this placeholder expression.

Observe que minutes * 60 não tem ponto e vírgula. Essa é a expressão final do corpo da função, portanto seu valor se torna o valor de retorno da função. Adicionar um ponto e vírgula a transformaria em uma instrução que não retorna esse valor.

Salve com Ctrl+O, pressione Enter e saia com Ctrl+X. Verifique o código:

cargo check

Em main, minutes_to_seconds(5) é uma chamada de função. O valor 5 é o argumento fornecido ao parâmetro minutes. Execute o programa:

cargo run --quiet

A primeira linha agora deve ser:

5 minutes = 300 seconds

Usar um parâmetro e um tipo de retorno decimal

Nesta etapa, você completará uma segunda função que aceita e retorna valores de ponto flutuante.

Abra o arquivo-fonte:

nano src/main.rs

Encontre celsius_to_fahrenheit. O parâmetro e o tipo de retorno são f64, portanto o cálculo pode preservar um resultado fracionário. A expressão temporária celsius * 0.0 usa o parâmetro, mas retorna zero de propósito. Substitua essa expressão completa por:

    celsius * 9.0 / 5.0 + 32.0 // Step 2: replace this placeholder expression.

Este é outro retorno por expressão: o valor calculado é o último item do corpo da função e não tem ponto e vírgula. A multiplicação e a divisão são avaliadas antes da adição, de acordo com a precedência aritmética normal. Os parênteses podem deixar explícita uma ordem pretendida mais complexa. Quem chama a função não precisa conhecer a fórmula: fornece um argumento em Celsius e recebe o valor retornado em Fahrenheit.

Salve, saia e execute o programa:

cargo run --quiet

A segunda linha deve ser:

20.0 C = 68.0 F

A chamada celsius_to_fahrenheit(20.0) fornece um argumento. O valor retornado é armazenado na variável fahrenheit antes de ser formatado para exibição.

Reutilizar uma função com vários argumentos

Nesta etapa, você completará uma função com dois parâmetros e observará duas chamadas reutilizando essa função.

A função scale_amount preparada recebe amount e factor. Os parâmetros são separados por vírgulas, e cada parâmetro tem seu próprio tipo. Uma chamada deve fornecer os argumentos na mesma ordem.

Abra o arquivo e encontre o espaço reservado da Etapa 3:

nano src/main.rs

A expressão temporária amount * factor * 0.0 retorna zero de propósito. Substitua essa expressão completa por:

    amount * factor // Step 3: replace this placeholder expression.

Salve e saia. Em seguida, faça uma verificação final:

cargo check

Execute o programa concluído:

cargo run --quiet

A mesma função é chamada uma vez para a farinha e outra vez para a água. As duas últimas linhas devem ser:

Scaled flour: 375.0 g
Scaled water: 270.0 ml

Este é o principal benefício de uma função: o cálculo é definido uma vez, recebe um nome claro e pode ser reutilizado com argumentos diferentes.

Resumo

Você completou funções com parâmetros inteiros e de ponto flutuante, interpretou as setas dos tipos de retorno, retornou valores usando expressões finais, passou argumentos em chamadas de função e reutilizou uma função em vários cálculos.