Кортежи и массивы

Группируем значения: кортежи объединяют разные типы, массивы — фиксированный набор одного типа.

Кортеж (tuple) — упорядоченный набор значений, возможно разных типов, с фиксированной длиной.

Кортежи

Кортеж собирает несколько значений в одно составное. Типы элементов могут различаться, а длина задаётся при создании и не меняется.

fn main() {
    let point = (3, 4.5, "метка"); // (i32, f64, &str)
    // доступ по индексу через точку
    println!("{} {} {}", point.0, point.1, point.2);
}

Вывод:

3 4.5 метка

Кортеж удобно разбирать на отдельные переменные — это называется деструктуризацией. Часто так возвращают из функции несколько значений сразу.

fn min_max(data: &[i32]) -> (i32, i32) {
    let mut lo = data[0];
    let mut hi = data[0];
    for &x in data {
        if x < lo { lo = x; }
        if x > hi { hi = x; }
    }
    (lo, hi) // возвращаем кортеж
}

fn main() {
    let nums = [4, 1, 7, 3];
    let (low, high) = min_max(&nums); // деструктуризация
    println!("мин={low} макс={high}");
}

Вывод:

мин=1 макс=7

Пустой кортеж () называется «unit» и означает «нет значимого значения» — его возвращают функции, которые ничего не возвращают по существу.

Массивы

Массив — набор элементов одного типа и фиксированной длины, известной на этапе компиляции. Тип массива записывается как [T; N], где N — длина.

fn main() {
    let days: [&str; 3] = ["пн", "вт", "ср"];
    let zeros = [0; 5]; // [0, 0, 0, 0, 0] — пять нулей
    println!("{} дней, первый: {}", days.len(), days[0]);
    println!("{:?}", zeros);
}

Вывод:

3 дней, первый: пн
[0, 0, 0, 0, 0]

Защита от выхода за границу

В C обращение за границу массива — источник уязвимостей. В Rust индексация проверяется: если индекс вне диапазона, программа аварийно завершится с понятной паникой, а не прочитает чужую память.

fn main() {
    let a = [10, 20, 30];
    let i = 5;
    println!("{}", a[i]); // паника в рантайме: index out of bounds: the len is 3 but the index is 5
}

Это безопасно: вместо тихого чтения постороннего участка памяти вы получаете явную ошибку. А чтобы вообще избегать паники, элементы достают через .get(i), который возвращает Option (об этом — в уроке про enum).

Когда что использовать

СтруктураКогда
Кортежнесколько значений разных типов вместе, вернуть пару из функции
Массив [T; N]фиксированное число однотипных значений, размер известен заранее
Вектор Vec<T>список однотипных значений переменной длины (следующий урок)

Итог

  • Кортеж объединяет значения разных типов; доступ через .0, .1 и деструктуризацию.
  • Массив [T; N] — фиксированная длина и один тип; индексация проверяется на выход за границу.
  • Для переменной длины используют вектор Vec<T> — о нём дальше.
Проверьте себя
1. Чем кортеж отличается от массива?
AНичем
BКортеж может хранить значения разных типов, массив — только одного типа
CКортеж длиннее
DМассив хранит разные типы
2. Что произойдёт при обращении к массиву по индексу вне диапазона?
AПрочитается чужая память
BПрограмма аварийно завершится с паникой index out of bounds
CВернётся 0
DНичего, индекс обрежется
3. Как записывается тип массива из 5 элементов i32?
AVec<i32>
B[i32; 5]
CArray<i32, 5>
Di32[5]
Поддержать проект