Funciones y expresiones

RustBeginner
Practicar Ahora

Introducción

Una función asigna un nombre a una tarea para que un programa pueda ejecutarla siempre que sea necesario. Las funciones pueden recibir datos de entrada mediante parámetros y devolver un valor calculado.

En este laboratorio, un proyecto de Cargo preparado ya contiene tres funciones de conversión y todas sus llamadas. En cada paso, sustituirá una expresión de marcador de posición. Así, escribirá poco código y verá cómo se relacionan las definiciones de funciones, los parámetros, los tipos de retorno, las expresiones y las llamadas.

Devolver un valor desde una función

En este paso, completará una función que convierte minutos en segundos y relacionará su definición con la llamada correspondiente.

Acceda al proyecto preparado y abra su archivo de código fuente:

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

Al principio del archivo, esta línea inicia una definición de función:

fn minutes_to_seconds(minutes: i32) -> i32 {
  • fn introduce una función.
  • minutes_to_seconds es el nombre de la función.
  • minutes: i32 es un parámetro: una entrada llamada minutes cuyo tipo es el entero i32.
  • -> i32 indica que la función devuelve un valor i32.
  • Las llaves contienen el cuerpo de la función.

Rust comprueba cada llamada comparándola con esta firma. La persona que realiza la llamada debe proporcionar el número esperado de argumentos, en el orden declarado, y cada argumento debe tener un tipo compatible.

Sustituya únicamente el 0 que aparece antes del comentario de Step 1 por:

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

Observe que minutes * 60 no tiene punto y coma. Es la expresión final del cuerpo de la función, por lo que su valor se convierte en el valor de retorno de la función. Si añade un punto y coma, la convertirá en una sentencia que no devuelve este valor.

Guarde el archivo con Ctrl+O, pulse Enter y salga con Ctrl+X. Compruebe el código:

cargo check

En main, minutes_to_seconds(5) es una llamada a una función. El valor 5 es el argumento que se proporciona al parámetro minutes. Ejecute el programa:

cargo run --quiet

La primera línea debería ser ahora:

5 minutes = 300 seconds

Usar un parámetro y un tipo de retorno decimal

En este paso, completará una segunda función que acepta y devuelve valores de coma flotante.

Abra el archivo de código fuente:

nano src/main.rs

Busque celsius_to_fahrenheit. Tanto su parámetro como su tipo de retorno son f64, por lo que el cálculo puede conservar un resultado fraccionario. La expresión temporal celsius * 0.0 utiliza el parámetro, pero devuelve deliberadamente cero. Sustituya la expresión completa por:

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

Este es otro retorno mediante una expresión: el valor calculado es el último elemento del cuerpo de la función y no tiene punto y coma. La multiplicación y la división se evalúan antes que la suma, de acuerdo con la precedencia aritmética habitual. Los paréntesis permiten hacer explícito un orden de evaluación más complejo. La persona que realiza la llamada no necesita conocer la fórmula: proporciona un argumento en grados Celsius y recibe el valor devuelto en grados Fahrenheit.

Guarde el archivo, salga del editor y ejecute el programa:

cargo run --quiet

La segunda línea debería ser:

20.0 C = 68.0 F

La llamada celsius_to_fahrenheit(20.0) pasa un argumento. El valor devuelto se almacena en la variable fahrenheit antes de darle formato para mostrarlo.

Reutilizar una función con varios argumentos

En este paso, completará una función con dos parámetros y observará cómo se reutiliza en dos llamadas.

La función preparada scale_amount recibe amount y factor. Los parámetros se separan mediante comas y cada uno tiene su propio tipo. Una llamada debe proporcionar los argumentos en el mismo orden.

Abra el archivo y busque el marcador de posición de Step 3:

nano src/main.rs

La expresión temporal amount * factor * 0.0 devuelve deliberadamente cero. Sustituya la expresión completa por:

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

Guarde el archivo y salga del editor. Después, realice una comprobación final:

cargo check

Ejecute el programa completado:

cargo run --quiet

La misma función se llama una vez para la harina y otra vez para el agua. Las dos últimas líneas deberían ser:

Scaled flour: 375.0 g
Scaled water: 270.0 ml

Esta es la principal ventaja de una función: el cálculo se define una sola vez, recibe un nombre claro y se reutiliza con distintos argumentos.

Resumen

Ha completado funciones con parámetros enteros y de coma flotante, ha interpretado las flechas de los tipos de retorno, ha devuelto valores mediante expresiones finales, ha pasado argumentos en llamadas a funciones y ha reutilizado una función para realizar varios cálculos.