Кортежи
Кортеж - это коллекция значений разных типов. Кортежи создаются с использованием круглых скобок ()
, и каждый кортеж сам по себе является значением с сигнатурой типа (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 )