Skip to content

Commit 3a1353e

Browse files
committed
feat: add a chapter for collections
1 parent f29b922 commit 3a1353e

File tree

2 files changed

+164
-0
lines changed

2 files changed

+164
-0
lines changed

src/es/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- [Punto de entrada](./quick-comparisons/entry-point.md)
88
- [Tooling](./quick-comparisons/tooling.md)
99
- [Tipos escalares](./quick-comparisons/scalar-types.md)
10+
- [Tuplas y Colecciones](./quick-comparisons/tuples-and-collections.md)
1011
- [Declaración de variables](./quick-comparisons/variable-declaration.md)
1112
- [Casting](./quick-comparisons/casting.md)
1213
- [Control de flujo](./quick-comparisons/control-flow.md)
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
# Tuplas y Colecciones
2+
3+
## Tuplas
4+
5+
Una tupla es un conjunto de variables que se agrupan, generalmente de diferentes
6+
tipos, en una sola entidad. Esto permite que se manejen como una unidad en lugar
7+
de individualmente.
8+
9+
En Go no existen las tuplas como un tipo de dato estrictamente, pero si podemos
10+
llegar a reconocer algo similar a una tupla por ejemplo cuando usamos el
11+
retorno de múltiples valores en una función. Por ejemplo:
12+
13+
```go
14+
# package main
15+
#
16+
# import (
17+
# "fmt"
18+
# )
19+
#
20+
func getCoordinates() (int, int) {
21+
return 10, 20
22+
}
23+
24+
func main() {
25+
x, y := getCoordinates()
26+
fmt.Println(x, y) // Imprime: 10 20
27+
}
28+
```
29+
30+
Los múltiples valores devueltos suelen cumplir una función similar a las tuplas.
31+
32+
En Rust, las tuplas son un tipo de dato. Se definen con paréntesis y accedemos
33+
mediante la posición. Por ejemplo:
34+
35+
```rust
36+
let coords = (10, 20, "Las coordenadas", "x e y");
37+
println!("{}, {}", coords.0, coords.1);
38+
```
39+
40+
Además gracias al pattern matching podemos desestructurar las tuplas de
41+
forma más sencilla:
42+
43+
```rust
44+
let coords = (10, 20, "Las coordenadas", "x e y");
45+
let (x, y, desc1, desc2) = coords;
46+
println!("{desc1} {desc2} son:");
47+
println!("{x} para X");
48+
println!("{y} para Y");
49+
```
50+
51+
Si quisiéramos declarar el valor de retorno de una función como una tupla
52+
podría ser algo así:
53+
54+
```rust,no_run
55+
fn getCoordinates() -> (i32, i32) {
56+
(10, 20)
57+
}
58+
```
59+
60+
## Arrays / Slices / Vectores
61+
62+
Go utiliza la misma sintaxis para los tres tipos de datos
63+
64+
```go
65+
#package main
66+
#
67+
#import (
68+
# "fmt"
69+
#)
70+
#
71+
#func main() {
72+
// Arreglo (tamaño fijo)
73+
var arr [3]int = [3]int{1, 2, 3}
74+
75+
// Slice (tamaño dinámico, vista sobre array)
76+
var s []int = arr[1:3]
77+
78+
// Slice dinámico creado desde cero
79+
s2 := []int{1, 2, 3, 4}
80+
#
81+
#fmt.Println("arr =", arr)
82+
#fmt.Println("s =", s)
83+
#fmt.Println("s2 =", s2)
84+
#}
85+
```
86+
87+
Mientras que Rust hace una clara diferencia entre cada tipo, el array es el tipo
88+
primitivo, es una lista de elementos.
89+
90+
Por ejemplo:
91+
92+
```rust,no_run
93+
let arr: [i32; 3] = [1, 2, 3];
94+
let arr = [1, 2, 3];
95+
let arr = [1; 5]; // [1,1,1,1,1]
96+
```
97+
98+
Los arreglos no se pueden redimensionar, tiene un tamaño fijo, podemos modificar
99+
las posiciones si declaramos el arreglo como mutable, pero no podemos agregar
100+
nuevos elementos.
101+
102+
Consideramos a los slices como una referencia a un rango de elementos:
103+
104+
```rust
105+
let arr = [7, 5, 4];
106+
107+
let slice: &[i32] = &arr[1..3]; // [5, 4]
108+
#println!("{slice:?}")
109+
```
110+
111+
Además Rust tiene el tipo de dato `Vec`, el cual es un tipo de dato dinamico,
112+
esta colección puede ser modificada agregando nuevos elementos, podemos crear
113+
`Vec` de varias formas, pero una de las más convencionales es con la macro
114+
`vec!`:
115+
116+
```rust
117+
let mut v = vec![1, 2, 3];
118+
v.push(4);
119+
#println!("{v:?}")
120+
```
121+
122+
Al declarar como mutable podemos utilizar el método `push` para agregar
123+
elementos dentro.
124+
125+
Por otro lado hay que aclarar que tanto los array, como los slices y los `Vec`,
126+
son tipos de datos que solo almacenan un único tipo de dato dentro, para
127+
utilizar más de un tipo de dato posiblemente deberíamos de utilizar una tupla.
128+
129+
### Mapas / Diccionarios / HashMaps
130+
131+
Un mapa es una estructura de datos que guarda pares clave-valor.
132+
- Cada clave es única
133+
- A partir de una clave, puedes obtener el valor asociado
134+
135+
En Go hariamos algo como esto:
136+
137+
```go
138+
#package main
139+
#
140+
#import (
141+
# "fmt"
142+
#)
143+
#
144+
#func main() {
145+
m := make(map[string]int)
146+
m["manzana"] = 3
147+
m["naranja"] = 5
148+
149+
fmt.Println("Hay", m["manzana"], "manzanas")
150+
#}
151+
```
152+
153+
Mientras que el mismo ejemplo en Rust seria así:
154+
155+
```rust
156+
#use std::collections::HashMap;
157+
#
158+
let mut mapa = HashMap::new();
159+
mapa.insert("manzana", 3);
160+
mapa.insert("naranja", 5);
161+
162+
println!("Hay {} manzanas", mapa.get("manzana").unwrap());
163+
```

0 commit comments

Comments
 (0)