Las tuplas son tipos de datos compuestos que permiten agrupar múltiples valores de diferentes tipos en una sola entidad. A diferencia de los arreglos (arrays), que requieren que todos sus elementos sean del mismo tipo, las tuplas son heterogéneas. Se consideran “tipos de producto” porque su tamaño es fijo; una vez definida la tupla, no puedes añadir ni eliminar elementos.
Su principal ventaja es la simplicidad. Se utilizan cuando necesitas agrupar datos relacionados de forma rápida para devolver múltiples valores desde una función o para representar pares de datos simples (como coordenadas (x, y)) sin la necesidad de declarar una estructura (struct) completa. Sin embargo, el uso excesivo de tuplas para modelar lógica de negocio compleja es un error común: al no tener nombres de campo, el código se vuelve difícil de leer, ya que los desarrolladores deben recordar qué posición ocupa cada dato (ej. tup.0, tup.1), lo que se conoce como “índices mágicos”.
Un detalle técnico importante es que las tuplas no implementan el trait Display (no se pueden imprimir con {} directamente), pero sí implementan Debug (se pueden imprimir con {:?}), lo que permite ver su contenido para depuración. Además, la tupla vacía () se conoce como “unit type”; representa la ausencia de un valor útil y es el tipo de retorno implícito de cualquier función en Rust que no especifique un tipo de retorno.
// Función que devuelve una tupla con dos valores de tipo i32
fn obtener_coordenadas() -> (i32, i32) {
(10, 20) // Retorno implícito de una tupla
}
fn main() {
// 1. Declaración de una tupla heterogénea
let datos_mixtos: (i32, f64, &str) = (1, 3.14, "Rust");
// 2. Acceso mediante índice con punto
println!("ID: {}, Flotante: {}, Texto: {}", datos_mixtos.0, datos_mixtos.1, datos_mixtos.2);
// 3. Desestructuración (Destructuring) para extraer valores
let (id, valor, etiqueta) = datos_mixtos;
println!("Etiqueta extraída: {}", etiqueta);
// 4. Uso de la tupla como retorno múltiple de una función
let (x, y) = obtener_coordenadas();
println!("Coordenadas: x={}, y={}", x, y);
// 5. Tupla anidada (una tupla dentro de otra)
let anidada = (1, (10, 20), 3);
println!("Valor anidado: {}", anidada.1.0);
// 6. El "unit type" (tupla vacía)
let unidad: () = ();
println!("Unidad: {:?}", unidad);
}
Explicación del Código
– datos_mixtos: Es una tupla de tipo (i32, f64, &str). Se accede a sus elementos mediante el índice seguido de un punto, como datos_mixtos.0 para obtener el entero 1.
– let (id, valor, etiqueta) = datos_mixtos: Este proceso se llama desestructuración. Copia los valores de datos_mixtos en las nuevas variables id, valor y etiqueta.
– obtener_coordenadas: Esta función devuelve una tupla de tipo (i32, i32). En main, usamos let (x, y) para recibir ambos valores simultáneamente.
– anidada: Es una tupla que contiene en su segundo índice (.1) otra tupla. Para acceder al primer elemento de esa tupla interna, usamos la cadena de índices anidada.1.0.
– unidad: Es una variable de tipo (), el “unit type”. Se utiliza para indicar que una expresión no produce un valor significativo.
N° 15