Introducción: los vectores son simples, hasta que necesitas unirlos
\nImagina: estás escribiendo un programa en Rust que procesa datos. Obtienes dos Vec<i32> y quieres combinarlos en uno. Parecería que no podría ser más simple. Pero cualquiera que haya hecho esta pregunta en Stack Overflow (¡y hay miles!) sabe: en Rust hay al menos 5 formas de hacerlo, y la mitad de ellas son errores que o no compilarán o consumirán todo el rendimiento.
En este artículo, analizaremos la pregunta popular «What is the best way to concatenate vectors in Rust?» y la convertiremos en una guía práctica. Aprenderás cómo unir vectores correctamente, qué trampas esperan a los principiantes y cómo escribir código eficiente en Rust. ¡Vamos allá!
\n\n¿Por qué la concatenación de vectores en Rust no es una tarea tan trivial?
\nA diferencia de Python o JavaScript, donde simplemente puedes escribir list1 + list2, Rust requiere que indiques explícitamente qué quieres hacer con la memoria. Un vector en Rust no es solo una lista, sino una estructura que posee datos en el heap. Las operaciones con él pueden provocar:
- \n
- Reasignaciones (copia de todo el búfer). \n
- Pérdida de propiedad (move semantics). \n
- Clonaciones innecesarias (si los datos son grandes). \n
Por lo tanto, la elección del método depende del contexto: si necesitas conservar los vectores originales, qué tipo de datos contienen, y si la velocidad es importante.
\n\nTop 5 errores al unir vectores en Rust
\nRepasemos los errores más comunes que cometen los principiantes (y no solo ellos).
\n\nError n.º 1: Usar + para Vec (no compilará)
\nEl intento más intuitivo, pero incorrecto:
\nlet v1 = vec![1, 2, 3];\nlet v2 = vec![4, 5, 6];\nlet v3 = v1 + v2; // ¡Error! cannot add `Vec<{integer}>` to `Vec<{integer}>`\nEl operador + solo está sobrecargado para cadenas y números, no para vectores. Rust no permite sumar colecciones directamente.
Error n.º 2: Olvidar el move y perder datos
\nMuchos usan append y se sorprenden de que el primer vector quede vacío:
let mut v1 = vec![1, 2, 3];\nlet mut v2 = vec![4, 5, 6];\nv1.append(&mut v2);\nprintln!("{:?}", v2); // ¡Vacío! v2 ahora está vacío.\nappend mueve los elementos del segundo vector al primero, dejando v2 vacío. Esto es eficiente, pero no siempre es lo esperado.
Error n.º 3: Clonación ingenua de todo
\nCuando necesitas conservar ambos vectores originales, los principiantes suelen escribir:
\nlet v1 = vec![1, 2, 3];\nlet v2 = vec![4, 5, 6];\nlet mut v3 = v1.clone();\nv3.extend(v2.clone()); // ¡Dos clonaciones!\nPara vectores grandes con String o estructuras complejas, esto mata el rendimiento. Es mejor usar referencias o chain.
Error n.º 4: Ignorar capacity al usar extend
\nUn simple extend puede provocar múltiples reasignaciones:
let mut v1 = vec![1, 2, 3];\nlet v2 = vec![4, 5, 6];\nv1.extend(v2); // Si la capacidad de v1 es pequeña, habrá reasignación.\nSi conoces el tamaño final, es mejor reservar memoria de antemano: v1.reserve(v2.len()).
Error n.º 5: Confundir extend y append
\nextend acepta un iterador y puede clonar elementos (si pasas &vec). append mueve elementos sin clonar. La elección no es obvia hasta que lees la documentación.
Las mejores formas de unir vectores en Rust (con ejemplos)
\nAhora que conocemos al enemigo, analicemos los enfoques correctos. Cada uno es bueno para su escenario.
\n\nForma 1: extend — universal y comprensible
\nEl método más común. Agrega ele