Кортежи помогают объединить в один набор значения разных типов. Они очень похожи на массивы за исключением некоторой отличии формы и состава содержания. Массивы в отличии от кортежей не могут содержать в себе данных разных типов. Примеры объявления и вывода на консоль содержания кортежей:
fn main() {
let data = (10_000_000, 183.19, 'й', 'Q', "Hello, Rust!", ());
let copy_of_data = data;
print!("{}, {}, {}, {}, {:?}", data.0, copy_of_data.1, data.3,data.4,data.5);
}
Указания типа данных кортежа явным образом:
fn main() {
let data: (u32, f32, char, char, &'static str, ()) = (10_000_000, 183.19, 'й', 'Q', "Hello, Rust!", ());
let copy_of_data = data;
print!(
"{}, {}, {}, {}, {:?}",
data.0, copy_of_data.1, data.3, data.4, data.5
);
}
Также как и массивы (и другие переменные) кортеж для изменений должен содержать в своём объявлении ключевое слово `mut':
fn main() {
let mut data: (u32, f32, char, char, &'static str, ()) = (10_000_000, 183.19, 'й', 'Q', "Hello, Rust!", ());
data.0 = 1;
data.1 = 1.1;
data.2 = 'j';
print!(
"{}, {}, {}, {}, {}, {:?}",
data.0, data.1,data.2, data.3, data.4, data.5
);
}
Важным отличием кортежа от массива является то, что получить доступ по индексу, значение которой находится в переменной он не может.
fn main() {
let array: [u16; 3] = [152, 133, 146];
let _tuple: (u8, u16, u16) = (16, 153, 214);
let i = 0;
print!("{}", array[i]);
//print!("{}", _tuple.i);
}
Структурой является более сложная форма группировки значений разного типа. Каждому элементу структуры присваивается имя. Благодаря этого элементы структуры легче объявить, получить доступ. Пример объявления и инициализации структуры:
#[derive(Debug)]
struct Data {
id: u16,
text: &'static str,
prefix: char,
}
fn main() {
let data = Data {
id: 405,
text: "info",
prefix: 'G',
};
print!("{:?}", data);
}
В том случае если состав кортежа необходимо объявить заранее, тогда используют кортеж-структуру:
#[derive(Debug)]
struct Data(u16, &'static str, char, [i32; 5]);
fn main() {
let data = Data(405, "info", 'G', [4555, 2334343, 65565]);
println!("{:?}", data);
}
Найдите как можно больше отличий кортежей от массивов. Подумайте, как можно получить доступ к элементу кортежа, как перебрать содержание элементов с помощью циклов, как использовать содержание кортежей в логических операциях.
От простого хранения данных нет особого смысла, если нет возможности удобного к ним доступа. Как это сделать вы узнаете при дальнейшем изучении возможностей стандартной библиотеки Rust.