Изучение кортежей в Rust и транспонирование матриц

RustRustBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном задании мы исследуем кортежи в Rust. Кортежи - это коллекции значений разных типов, которые создаются с использованием круглых скобок. Они могут использоваться в качестве аргументов функций и возвращаемых значений, что позволяет функциям возвращать несколько значений. Кортежи также могут использоваться в качестве членов других кортежей. Rust предоставляет индексирование кортежей для доступа к значениям в кортеже. Кортежи можно выводить на печать и их можно деструктурировать для создания связей. Кроме того, мы узнаем, как добавить трейт fmt::Display к структуре для настройки формата ее вывода. Наконец, мы получаем задание по реализации функции transpose, которая меняет местами два элемента в матрице.

Примечание: Если в лабораторном задании не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/floating_types("Floating-point Types") rust/DataTypesGroup -.-> rust/boolean_type("Boolean Type") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") subgraph Lab Skills rust/variable_declarations -.-> lab-99193{{"Изучение кортежей в Rust и транспонирование матриц"}} rust/integer_types -.-> lab-99193{{"Изучение кортежей в Rust и транспонирование матриц"}} rust/floating_types -.-> lab-99193{{"Изучение кортежей в Rust и транспонирование матриц"}} rust/boolean_type -.-> lab-99193{{"Изучение кортежей в Rust и транспонирование матриц"}} rust/type_casting -.-> lab-99193{{"Изучение кортежей в Rust и транспонирование матриц"}} rust/function_syntax -.-> lab-99193{{"Изучение кортежей в Rust и транспонирование матриц"}} rust/expressions_statements -.-> lab-99193{{"Изучение кортежей в Rust и транспонирование матриц"}} rust/lifetime_specifiers -.-> lab-99193{{"Изучение кортежей в Rust и транспонирование матриц"}} end

Кортежи

Кортеж - это коллекция значений разных типов. Кортежи создаются с использованием круглых скобок (), и каждый кортеж сам по себе является значением с сигнатурой типа (T1, T2,...), где T1, T2 - типы его членов. Функции могут использовать кортежи для возврата нескольких значений, так как кортежи могут содержать любое количество значений.

// Кортежи могут использоваться в качестве аргументов функций и возвращаемых значений.
fn reverse(pair: (i32, bool)) -> (bool, i32) {
    // `let` можно использовать для связывания членов кортежа с переменными.
    let (int_param, bool_param) = pair;

    (bool_param, int_param)
}

// Следующая структура используется для задания.
#[derive(Debug)]
struct Matrix(f32, f32, f32, f32);

fn main() {
    // Кортеж с множеством разных типов.
    let long_tuple = (1u8, 2u16, 3u32, 4u64,
                      -1i8, -2i16, -3i32, -4i64,
                      0.1f32, 0.2f64,
                      'a', true);

    // Значения можно извлекать из кортежа с использованием индексирования кортежа.
    println!("Первый элемент длинного кортежа: {}", long_tuple.0);
    println!("Второй элемент длинного кортежа: {}", long_tuple.1);

    // Кортежи могут быть членами других кортежей.
    let tuple_of_tuples = ((1u8, 2u16, 2u32), (4u64, -1i8), -2i16);

    // Кортежи можно выводить на печать.
    println!("Кортеж из кортежей: {:?}", tuple_of_tuples);

    // Но длинные кортежи (более 12 элементов) нельзя вывести на печать.
    //let too_long_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
    //println!("Слишком длинный кортеж: {:?}", too_long_tuple);
    // TODO ^ Раскомментируйте вышеуказанные 2 строки, чтобы увидеть ошибку компилятора

    let pair = (1, true);
    println!("Пара: {:?}", pair);

    println!("Перевернутая пара: {:?}", reverse(pair));

    // Чтобы создать кортежи из одного элемента, требуется запятая, чтобы отличить их
    // от литерала, окруженного круглыми скобками.
    println!("Кортеж из одного элемента: {:?}", (5u32,));
    println!("Просто целое число: {:?}", (5u32));

    // Кортежи можно деструктурировать для создания связей.
    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);
}

Задание

  1. Вспомним: Добавьте трейт fmt::Display к структуре Matrix в вышеприведенном примере, чтобы, если вы переключитесь от вывода отладочной формы {:?} к форме вывода {}, вы увидели следующий вывод:

    ( 1.1 1.2 )
    ( 2.1 2.2 )

    Возможно, вам пригодится обратиться к примеру по выводу на печать.

  2. Добавьте функцию transpose с использованием функции reverse в качестве шаблона, которая принимает матрицу в качестве аргумента и возвращает матрицу, в которой два элемента поменялись местами. Например:

    println!("Матрица:\n{}", matrix);
    println!("Транспонированная матрица:\n{}", transpose(matrix));

    Результатом вывода будет:

    Матрица:
    ( 1.1 1.2 )
    ( 2.1 2.2 )
    Транспонированная матрица:
    ( 1.1 2.1 )
    ( 1.2 2.2 )

Резюме

Поздравляем! Вы завершили лабораторную работу по кортежам. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.