Введение
В этом лабораторном задании мы исследуем кортежи в Rust. Кортежи - это коллекции значений разных типов, которые создаются с использованием круглых скобок. Они могут использоваться в качестве аргументов функций и возвращаемых значений, что позволяет функциям возвращать несколько значений. Кортежи также могут использоваться в качестве членов других кортежей. Rust предоставляет индексирование кортежей для доступа к значениям в кортеже. Кортежи можно выводить на печать и их можно деструктурировать для создания связей. Кроме того, мы узнаем, как добавить трейт fmt::Display к структуре для настройки формата ее вывода. Наконец, мы получаем задание по реализации функции transpose, которая меняет местами два элемента в матрице.
Примечание: Если в лабораторном задании не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать
main.rs, скомпилировать и запустить его с помощьюrustc main.rs &&./main.
Кортежи
Кортеж - это коллекция значений разных типов. Кортежи создаются с использованием круглых скобок (), и каждый кортеж сам по себе является значением с сигнатурой типа (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);
}
Задание
Вспомним: Добавьте трейт
fmt::Displayк структуреMatrixв вышеприведенном примере, чтобы, если вы переключитесь от вывода отладочной формы{:?}к форме вывода{}, вы увидели следующий вывод:( 1.1 1.2 ) ( 2.1 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, чтобы улучшить свои навыки.