Массивы представляют набор элементов, при этом все элементы набора должны представлять один и тот же тип данных.
В Rust массив можно определять различными способами. Простейшее формальное объявление массива:
let название_массива: [тип_данных; размер];
После названия массива через точку с запятой в квадратных скобках сначала указывается тип данных элементов массива. А потом через точку с запятой размер массива, то есть число его элементов.
Например, объявление массива, который имеет 7 элементов типа i32
:
let numbers: [i32; 7];
Фактически выражение [i32; 7]
выступает в качестве типа массива. То есть фактически мы определили переменную numbers
и
указали ее тип - [i32; 7]
- массив из 7 элементов типа i32. Но такая переменная еще неинициализирована. Поэтому использовать
мы ее не можем.
Для инициализации переменной массива необходимо ей присвоить набор значений. Простейшее определение с инициализацией:
let переменная_массива: [тип_данных; размер] = [элемент1, элемент2, ... элементN];
В качестве значения в квадратных скобках через запятую перечисляются элементы массива. Например:
let numbers: [i32; 7] = [1, 2, 3, 5, 8, 13, 21];
В данном случае массив numbers
имеет 7 элементов: 1, 2, 3, 5, 8, 13, 21.
Как и в случае с обычной переменной можно сначала объявить переменную, а затем инициализировать ее:
let numbers: [i32; 7]; numbers = [1, 2, 3, 5, 8, 13, 21];
Также если массив инициализируется при его определении, то можно не указывать тип массива:
let numbers = [1, 2, 3, 5, 8, 13, 21];
В этом случае Rust сам выведет тип - [i32; 7]
Для обращения к элементам массива используется их числовой индекс:
название_массива[индекс_элемента]
Каждый элемент массива имеет числовой индекс. Индексация начинается с нуля. То есть первый элемент массива будет иметь индекс 0, второй элемент - индекс 1 и так далее.
Например, выведем на консоль первый и третий элементы массива:
fn main() { let users = ["Tom", "Bob", "Sam"]; println!("{}", users[0]); // Tom println!("{}", users[2]); // Sam }
Подобным образом можно не только получить, но и изменять элемент массива. Однако, если мы собираемся изменять элементы массива, то он должен определен с модификатором mut:
fn main(){ let mut users = ["Tom", "Bob", "Sam"]; // выводим второй элемент массива println!("{}", users[1]); // Bob // изменяем второй элемент массива users[1] = "Bill"; // снова выводим второй элемент массива println!("{}", users[1]); // Bill }
Стоит учитывать, что мы не можем обратиться к несуществующему элементу. Например, выше в примере в массиве есть всего три элемента. Соответственно индексом последнего элемента является число 2. Поэтому к элементам с индексами 3, 4 и больше мы обратиться не можем, так как их просто не существует. Например, в следующем случае при попытке обращения к несуществующему элементу мы столкнемся с ошибкой на этапе компиляции:
fn main(){ let mut users = ["Tom", "Bob", "Sam"]; users[6] = "Bill"; // !Ошибка - элемента с индексом 6 в массиве users нет }
Также следует учитывать, что массивы в Rust имеют фиксированный размер. После их определения мы не можем ни уменьшить, ни увеличить их размер.
Для перебра массива применяется цикл for:
fn main(){ let users = ["Tom", "Bob", "Sam"]; for user in users { print!("{} ", user); } println!(); // переходим на следующую строку в консоли let numbers = [1, 2, 3, 5, 8, 13, 21]; for n in numbers{ print!("{} ", n); } }
Консольный вывод программы:
Tom Bob Sam 1 2 3 5 8 13 21
Массивы также имеют еще одну форму определения:
let название_массива: [тип_данных; размер] = [значение_по умолчанию; размер];
В качестве значения в квадратных скобках сначала указывается значение по умолчанию, которым заполняется массив. А затем через точку с запятой количество элементов массива, которые должны принять это значение.
let numbers: [i32; 5] = [2; 5];
В данном случае каждый из пяти элементов массива numbers будет иметь значение "2".
Также можно сократь определение массива и не указывать тип:
fn main(){ let numbers = [2; 5]; for n in numbers{ print!("{} ", n); // 2 2 2 2 2 } }