Rust - Funciones

Las funciones son los componentes básicos del código legible, mantenible y reutilizable. Una función es un conjunto de declaraciones para realizar una tarea específica. Las funciones organizan el programa en bloques lógicos de código. Una vez definidas, las funciones se pueden llamar para acceder al código. Esto hace que el código sea reutilizable. Además, las funciones facilitan la lectura y el mantenimiento del código del programa.

Una declaración de función le dice al compilador sobre el nombre, el tipo de retorno y los parámetros de una función. Una definición de función proporciona el cuerpo real de la función.

No Señor Función descriptiva
1

Defining a function

La definición de la función TA especifica qué y cómo se haría una tarea específica.

2

Calling or invoking a Function

Se debe llamar a una función para ejecutarla.

3

Returning Functions

Las funciones también pueden devolver valor junto con el control, de vuelta a la persona que llama.

4

Parameterized Function

Los parámetros son un mecanismo para pasar valores a funciones.

Definición de una función

Una definición de función especifica qué y cómo se haría una tarea específica. Antes de usar una función, debe definirse. El cuerpo de la función contiene código que debería ejecutar la función. Las reglas para nombrar una función son similares a las de una variable. Las funciones se definen mediante elfnpalabra clave. La sintaxis para definir una función estándar se da a continuación

Sintaxis

fn function_name(param1,param2..paramN) {
   // function body
}

Una declaración de función puede contener opcionalmente parámetros / argumentos. Los parámetros se utilizan para pasar valores a funciones.

Ejemplo: definición de función simple

//Defining a function
fn fn_hello(){
   println!("hello from function fn_hello ");
}

Invocar una función

Se debe llamar a una función para ejecutarla. Este proceso se denominafunction invocation. Los valores de los parámetros deben pasarse cuando se invoca una función. La función que invoca otra función se llamacaller function.

Sintaxis

function_name(val1,val2,valN)

Ejemplo: invocación de una función

fn main(){
   //calling a function
   fn_hello();
}

Aquí, main () es la función de llamada.

Ilustración

El siguiente ejemplo define una función fn_hello(). La función imprime un mensaje en la consola. losmain()función invoca la función fn_hello () .

fn main(){
   //calling a function
   fn_hello();
}
//Defining a function
fn fn_hello(){
   println!("hello from function fn_hello ");
}

Salida

hello from function fn_hello

Devolución de valor de una función

Las funciones también pueden devolver un valor junto con el control a la persona que llama. Estas funciones se denominan funciones de retorno.

Sintaxis

Cualquiera de las siguientes sintaxis se puede utilizar para definir una función con tipo de retorno.

Con declaración de devolución

// Syntax1
fn function_name() -> return_type {
   //statements
   return value;
}

Sintaxis abreviada sin declaración de retorno

//Syntax2
fn function_name() -> return_type {
   value //no semicolon means this value is returned
}

ilustracion

fn main(){
   println!("pi value is {}",get_pi());
}
fn get_pi()->f64 {
   22.0/7.0
}

Salida

pi value is 3.142857142857143

Función con parámetros

Los parámetros son un mecanismo para pasar valores a funciones. Los parámetros forman parte de la firma de la función. Los valores de los parámetros se pasan a la función durante su invocación. A menos que se especifique explícitamente, el número de valores pasados ​​a una función debe coincidir con el número de parámetros definidos.

Los parámetros se pueden pasar a una función mediante una de las siguientes técnicas:

Pasar por valor

Cuando se invoca un método, se crea una nueva ubicación de almacenamiento para cada parámetro de valor. Los valores de los parámetros reales se copian en ellos. Por lo tanto, los cambios realizados en el parámetro dentro del método invocado no tienen ningún efecto sobre el argumento.

El siguiente ejemplo declara una variable no, que inicialmente es 5. La variable se pasa como parámetro (por valor) al mutate_no_to_zero()functionnction, que cambia el valor a cero. Después de la llamada a la función cuando el control vuelve al método principal, el valor será el mismo.

fn main(){
   let no:i32 = 5;
   mutate_no_to_zero(no);
   println!("The value of no is:{}",no);
}

fn mutate_no_to_zero(mut param_no: i32) {
   param_no = param_no*0;
   println!("param_no value is :{}",param_no);
}

Salida

param_no value is :0
The value of no is:5

Pasar por referencia

Cuando pasa parámetros por referencia, a diferencia de los parámetros de valor, no se crea una nueva ubicación de almacenamiento para estos parámetros. Los parámetros de referencia representan la misma ubicación de memoria que los parámetros reales que se suministran al método. Los valores de los parámetros se pueden pasar por referencia prefijando el nombre de la variable con un& .

En el ejemplo que se muestra a continuación, tenemos una variable no , que inicialmente es 5. Una referencia a la variable no se pasa almutate_no_to_zero()función. La función opera sobre la variable original. Después de la llamada a la función, cuando el control vuelve al método principal, el valor de la variable original será cero.

fn main() {
   let mut no:i32 = 5;
   mutate_no_to_zero(&mut no);
   println!("The value of no is:{}",no);
}
fn mutate_no_to_zero(param_no:&mut i32){
   *param_no = 0; //de reference
}

El operador * se utiliza para acceder al valor almacenado en la ubicación de la memoria que la variable param_nopuntos a. Esto también se conoce como desreferenciación.

La salida será -

The value of no is 0.

Pasando cadena a una función

La función main () pasa un objeto de cadena a la función display () .

fn main(){
   let name:String = String::from("TutorialsPoint");
   display(name); 
   //cannot access name after display
}
fn display(param_name:String){
   println!("param_name value is :{}",param_name);
}

Salida

param_name value is :TutorialsPoint