# Funciones

Las funciones son una de las caracter铆sticas m谩s importantes de Rust.

Todo programa Rust posee al menos una funci贸n, la funci贸n main:

fn main() {   
}

Esta es la declaraci贸n de funci贸n mas simple posible. la palabra clave fn indica 鈥榚sto es una funci贸n鈥, seguido del nombre, par茅ntesis (en este casos sin contenido ya que no recibe ning煤n argumento) y luego llaves para indicar el cuerpo de la funci贸n.

He aqu铆 una funci贸n llamada ejemplo:

fn ejemplo() {   
}

Como ya hemos mencionado entre los parentesis () de una funci贸n podemos incluir argumentos, estos argumentos se declaran de la siguiente manera:

fn imprimir_numero(x: i32) {
    println!("x es: {}", x);
}

En la funcion imprimir_numero (arriba indicada) incluimos como argumentos un i32, recuerda de la lecci贸n de tipos de datos, que es un tipo de dato n煤mero (en este caso con un tama帽o de 32-bit) el nombre que recibira este n煤mero dentro de la funci贸n sera x.

La sintaxis es: nombre del argumento seguido de dos puntos y el tipo de dato. Ej: casado: bool, donde casado es el nombre del argumento y bool es el tipo de dato booleano.

Si queremos pasar mas de un argumento en una funcion los debemos separar con comas:

fn imprimir_suma(x: i32, y: i32) {
    println!("suma es: {}", x + y);
}

TIP

  • Aunque la inferencia de datos en Rust se puede reailzar dentro de las funciones, documentar tus tipos de manera explicita es una muy buena practica.

Ya hemos visto como pasar argumentos de entrada a una funcion, ahora veamos como retornar un valor:

fn suma_uno(x: i32) -> i32 {
    x + 1
}

La funciones en Rust retornan exactamente un valor, y el tipo es declarado despu茅s de una 鈥榝lecha鈥, que es un gui贸n (-) seguido por un signo mayor-que (>). La ultima linea de una funci贸n determina lo que esta retorna. En el caso anterior la funcion suma_uno devuelve un tipo de dato n煤mero entero i32.

TIP

  • Notaras la ausencia de un punto y coma en la 煤ltima linea, esto es correcto para la 煤ltima linea, que es la que en principio devuelve el valor. Esto es devido a que Rust es un lenguaje basado en experesiones: seguidamente veremos m谩s acerca de ello.

# Expresiones vs. Sentencias

Las expresiones retornan un valor, y las sentencias no, las sentencias deben terminar con un punto y coma.

Nota: est谩 es una explicaci贸n muy simplificada, ya daremos mas detalles!!!

# Retornos tempranos

Rust posee una palabra clave para los retornos tempranos de una funci贸n, que es cuando la funci贸n retorna el valor sin ser la 煤ltima l铆nea de la funci贸n, la palabra clave es: return.

En el siguiente ejemplo nunca llegaremos a la expresi贸n de la 煤ltima l铆nea ya que terminar谩 y retornara el valor de x con la sentencia return.

fn foo(x: i32) -> i32 {
    return x;

    // nunca llegaremos a este c贸digo!
    x + 1
}

# Funciones divergentes

馃槄 hablaremos en otro momento...

# Apuntadores a funci贸n

Vamos a realizar un acercamiento a los enlaces a variables que apunten a funciones, seguro que enseguida os dais cuenta de su potencial.

Declaramos una variable, tal y como vimos en la unidad de variables, y como tipo de dato ponemos una funcion de la siguiente manera:

let f: fn(i32) -> i32;

En este ejemplo a la variable le asignamos el nombre f y como tipo de dato una funcion que toma como argumento un numero entero i32 y retorna un numero entero i32,

Veamos un ejemplo mas real, primero creamos una funcion muy sencilla:

fn mas_uno(i: i32) -> i32 {
    i + 1
}

Somos conscientes de que esta funci贸n toma como argumento un numero entero, le suma 1 y devuelve el resultado de dicha suma.

Sigamos, creando una variable que apunte a esta funci贸n de la siguiente manera:

let f = mas_uno; // aqu铆 estamos utilizando la inferencia de datos.

finalmente vamos a utilizar esta variable de la siguiente manera, observa como pasando 5, por ejemplo, el resultado deber铆a ser 6, que es la sumas del argumento mas uno.

let seis = f(5);

Resumen

  • Nuevamente, las funciones son el elemento m谩s importante de Rust.
  • fn seguido de parentesis fn() es la forma m谩s basica de declarar una funci贸n
  • podemos declarar tipos de valores como argumentos de entrada entre los parentesis de la funcion
  • los tipos de valores de retorno se pueden declarar despues de los parentesis con una flecha ->