Las funciones son bloques de código reutilizables que realizan una tarea específica. En Rust, las funciones son fundamentales para estructurar y organizar el código. En esta sección, aprenderemos cómo definir y utilizar funciones en Rust.
Definiendo una Función
Para definir una función en Rust, utilizamos la palabra clave fn
, seguida del nombre de la función, los parámetros entre paréntesis y el cuerpo de la función entre llaves {}
.
Sintaxis Básica
fn nombre_de_la_funcion(parametro1: Tipo, parametro2: Tipo) -> TipoDeRetorno { // Cuerpo de la función }
Ejemplo Práctico
En este ejemplo:
fn main()
define la función principal del programa.fn saludar(nombre: &str)
define una función llamadasaludar
que toma un parámetronombre
de tipo&str
(una referencia a una cadena de texto) y no retorna ningún valor.
Explicación del Código
fn
: Palabra clave para definir una función.saludar
: Nombre de la función.nombre: &str
: Parámetro de la función con su tipo.println!("Hola, {}!", nombre);
: Línea de código que imprime un saludo en la consola.
Retornando Valores
Las funciones en Rust pueden retornar valores. Para especificar el tipo de retorno, utilizamos una flecha ->
seguida del tipo de dato.
Ejemplo Práctico
fn main() { let resultado = sumar(5, 3); println!("El resultado es: {}", resultado); } fn sumar(a: i32, b: i32) -> i32 { a + b }
En este ejemplo:
fn sumar(a: i32, b: i32) -> i32
define una función que toma dos parámetros de tipoi32
y retorna un valor de tipoi32
.a + b
es la expresión que se evalúa y se retorna como resultado de la función.
Explicación del Código
let resultado = sumar(5, 3);
: Llama a la funciónsumar
con los argumentos5
y3
, y almacena el resultado en la variableresultado
.a + b
: La expresión que se evalúa y se retorna.
Funciones con Retorno Temprano
Podemos usar la palabra clave return
para salir de una función antes de que termine su ejecución.
Ejemplo Práctico
fn main() { let resultado = dividir(10, 2); match resultado { Some(valor) => println!("El resultado es: {}", valor), None => println!("No se puede dividir por cero"), } } fn dividir(a: i32, b: i32) -> Option<i32> { if b == 0 { return None; } Some(a / b) }
En este ejemplo:
fn dividir(a: i32, b: i32) -> Option<i32>
define una función que retorna unOption<i32>
.return None;
retornaNone
sib
es igual a0
.Some(a / b)
retorna el resultado de la división envuelto enSome
.
Explicación del Código
Option<i32>
: Tipo de retorno que puede serSome(valor)
oNone
.if b == 0 { return None; }
: Condición que verifica sib
es0
y retornaNone
si es verdadero.Some(a / b)
: Retorna el resultado de la división envuelto enSome
.
Ejercicios Prácticos
Ejercicio 1: Función de Multiplicación
Escribe una función llamada multiplicar
que tome dos parámetros de tipo i32
y retorne su producto.
fn main() { let resultado = multiplicar(4, 5); println!("El resultado es: {}", resultado); } fn multiplicar(a: i32, b: i32) -> i32 { // Tu código aquí }
Solución
fn main() { let resultado = multiplicar(4, 5); println!("El resultado es: {}", resultado); } fn multiplicar(a: i32, b: i32) -> i32 { a * b }
Ejercicio 2: Función de Factorial
Escribe una función llamada factorial
que tome un parámetro de tipo u32
y retorne su factorial.
fn main() { let resultado = factorial(5); println!("El factorial de 5 es: {}", resultado); } fn factorial(n: u32) -> u32 { // Tu código aquí }
Solución
fn main() { let resultado = factorial(5); println!("El factorial de 5 es: {}", resultado); } fn factorial(n: u32) -> u32 { if n == 0 { 1 } else { n * factorial(n - 1) } }
Conclusión
En esta sección, hemos aprendido cómo definir y utilizar funciones en Rust. Hemos cubierto la sintaxis básica, cómo retornar valores y cómo manejar retornos tempranos. Además, hemos practicado con ejercicios para reforzar los conceptos aprendidos. En la siguiente sección, exploraremos el flujo de control en Rust, incluyendo condicionales y bucles.
Curso de Programación en Rust
Módulo 1: Introducción a Rust
- ¿Qué es Rust?
- Configuración del Entorno de Rust
- Programa "Hola, Mundo!"
- Sintaxis y Estructura Básica