|
| 1 | +# Funciones |
| 2 | + |
| 3 | +Las funciones en Rust y Go tienen algunas similitudes pero también diferencias |
| 4 | +importantes debido a la filosofía de cada lenguaje. |
| 5 | + |
| 6 | +| | Go | Rust | |
| 7 | +| --------------------------- | ------------------------------------------------- | ------------------------------- | |
| 8 | +| Palabra clave | `func` | `fn` | |
| 9 | +| Tipado del parámetro | Después del nombre del parámetro | Después de los dos puntos (`:`) | |
| 10 | +| Retorno | Después de paréntesis, antes de `{` | Después de `->` | |
| 11 | + |
| 12 | + |
| 13 | +Veamos un ejemplo de esto, en Go haríamos algo como esto: |
| 14 | + |
| 15 | +```go,no_run |
| 16 | +func suma(a int, b int) int { |
| 17 | + return a + b |
| 18 | +} |
| 19 | +``` |
| 20 | + |
| 21 | +Mientras que lo mismo en Rust sería: |
| 22 | + |
| 23 | +```rust,ignore |
| 24 | +fn suma(a: i32, b: i32) -> i32 { |
| 25 | + return a + b; |
| 26 | +} |
| 27 | +``` |
| 28 | + |
| 29 | +Bastante parecido ¿verdad? Sin embargo esa no es la forma más idiomatica de |
| 30 | +hacerlo en Rust, sino que lo más idiomatico seria utilizar una característica de |
| 31 | +Rust, en la que la ultima expresión de la función tiene un return implícito si |
| 32 | +es que no termina en `;`: |
| 33 | + |
| 34 | +```rust,ignore |
| 35 | +fn suma(a: i32, b: i32) -> i32 { |
| 36 | + a + b // retorna la ultima expresión si no termina en ; |
| 37 | +} |
| 38 | +``` |
| 39 | + |
| 40 | +Esto funcionara con todo lo que sea una expresión como por ejemplo lo son los |
| 41 | +controles de flujos, que veremos más adelante. |
| 42 | + |
| 43 | +## Closures |
| 44 | + |
| 45 | +También podemos trabajar como Closures las funciones, en Go esto se vería de |
| 46 | +esta forma: |
| 47 | + |
| 48 | +```go |
| 49 | +#package main |
| 50 | +# |
| 51 | +#import ( |
| 52 | +# "fmt" |
| 53 | +#) |
| 54 | +# |
| 55 | +#func main() { |
| 56 | + x := 5 |
| 57 | + sumar := func(y int) int { |
| 58 | + return x + y |
| 59 | + } |
| 60 | + fmt.Println(sumar(3)) // Imprime 8 |
| 61 | +#} |
| 62 | +``` |
| 63 | + |
| 64 | +Mientras que en Rust seria: |
| 65 | + |
| 66 | +```rust |
| 67 | + let x = 5; |
| 68 | + let sumar = |y| x + y; // closure que "captura" x |
| 69 | + |
| 70 | + println!("{}", sumar(3)); // Imprime 8 |
| 71 | +``` |
| 72 | + |
| 73 | +Algo curioso es que en la closure de Rust no es necesario definir el tipo del |
| 74 | +parámetro si es que no es ambiguo, en este caso como solo tiene un caso y el |
| 75 | +valor que recibe es `3` logra entender que `y` es de tipo `i32`, sin embargo |
| 76 | +podríamos tiparlo nosotros de ser necesario: |
| 77 | + |
| 78 | + |
| 79 | +```rust |
| 80 | + let x = 5; |
| 81 | + let sumar = |y:i32| x + y; // closure que "captura" x |
| 82 | + |
| 83 | + println!("{}", sumar(3)); // Imprime 8 |
| 84 | +``` |
| 85 | + |
| 86 | +Veremos más acerca del uso avanzado de funciones en algunos capítulos más |
| 87 | +adelante. |
| 88 | + |
0 commit comments