Tuplas - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Tuplas

Una tupla es una colección de valores de diferentes tipos. Se construyen tuplasusando paréntesis `()`, y cada tupla en sí es un valor con la anotación de tipo`(T1, t2, ...)` , donde `t1`, `t2` son los tipos de sus miembros. Las funcionespueden usar tuplas para devolver múltiples valores, ya que las tuplas pueden contener cualquier número devalores.

    // Las tuplas se pueden como argumentos de funciones y como sus valores de retorno.
    fn reverse(pair: (i32, bool)) -> (bool, i32) {
        // `let` se puede usar para ligar los miembros de la tupla a variables.
        let (int_param, bool_param) = pair;

        (bool_param, int_param)
    }

    // La siguiente `struct` es para la actividad.
    #[derive(Debug)]
    struct Matrix(f32, f32, f32, f32);

    fn main() {
        // Una tupla es montón de tipos diferentes.
        let long_tuple = (1u8, 2u16, 3u32, 4u64,
                          -1i8, -2i16, -3i32, -4i64,
                          0.1f32, 0.2f64,
                          'a', true);

        // Se pueden extraer valores de la tupla indexando    println!("Tupla grande primer valor: {}", long_tuple.0);
        println!("Tupla grande segundo valor: {}", long_tuple.1);

        // Tuplas con tuplas como miembros.
        let tuple_of_tuples = ((1u8, 2u16, 2u32), (4u64, -1i8), -2i16);

        // Las tuples se pueden imprimir.
        println!("tupla de tuplas: {:?}", tuple_of_tuples);

        // Pero no se pueden imprimir tuplas demasadio grandes (más de 12 elementos).
       // let tupla_demasiado_grande = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
       // println!("Tupla demasiado grande: {:?}", tupla_demasiado_grande);
       // TAREA ^ Quita el comentario de las 2 líneas anteriores para ver el error del compilador

        let pair = (1, true);
        println!("Par es {:?}", pair);

        println!("El par invertido es {:?}", reverse(pair));

        // Para crear un tuplas de un sólo elemento, se requiere la coma para distinguirlas
       // de un literal rodeado de paréntesis.
        println!("Una tupla de 1 elemento: {:?}", (5u32,));
        println!("Sólo un entero: {:?}", (5u32));

        // Las tuplas puede desestructurar para crear variables.
        let tuple = (1, "hello", 4.5, true);

        let (a, b, c, d) = tuple;
        println!("{:?}, {:?}, {:?}, {:?}", a, b, c, d);

        let matrix = Matrix(1.1, 1.2, 2.1, 2.2);
        println!("{:?}", matrix);
    }

### Actividad

1. Recapitulando: Agrega el rasgo `fmt::Display` a `Matrix` en el ejemploanterior, de modo que si cambias de imprimir el formato de depuración `{:?}` alformato de visualización `{}`, ves la siguiente salida:

       ( 1.1 1.2 )
       ( 2.1 2.2 )

   Es posible que desee consultar el ejemplo de impresión a pantalla.

2. Agrega una función `transpose` usando la función `reverse` como una plantilla, el cualacepta una matriz como argumento y devuelve una matriz en la que dos elementoshan sido intercambiados. Por ejemplo:

       println!("Matriz:\n{}", matrix);
       println!("Transpuesta:\n{}", transpose(matrix));

   Resultados en el output:

       Matrix:
       ( 1.1 1.2 )
       ( 2.1 2.2 )
       Transpose:
       ( 1.1 2.1 )
       ( 1.2 2.2 )