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

fn main() {
    saludar("Mundo");
}

fn saludar(nombre: &str) {
    println!("Hola, {}!", nombre);
}

En este ejemplo:

  • fn main() define la función principal del programa.
  • fn saludar(nombre: &str) define una función llamada saludar que toma un parámetro nombre 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 tipo i32 y retorna un valor de tipo i32.
  • 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ón sumar con los argumentos 5 y 3, y almacena el resultado en la variable resultado.
  • 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 un Option<i32>.
  • return None; retorna None si b es igual a 0.
  • Some(a / b) retorna el resultado de la división envuelto en Some.

Explicación del Código

  • Option<i32>: Tipo de retorno que puede ser Some(valor) o None.
  • if b == 0 { return None; }: Condición que verifica si b es 0 y retorna None si es verdadero.
  • Some(a / b): Retorna el resultado de la división envuelto en Some.

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.

© Copyright 2024. Todos los derechos reservados