Перейти к основному содержанию

14. Массивы (Array)

Массив – это фиксированный по длине набор однородных значений.

После инициализации массив не может быть изменен, т.е. его длина неизменяема. Значения элементов массива могут быть изменены, но не могут быть удалены.

Пример списка покупок:

fn main() {
	let shopping: [&str; 5] = ["bread", "milk", "cheese", "apple", "noodles"];
	println!("{:?}", shopping);
}
Результат: ["bread", "milk", "cheese", "apple", "noodles"]

Общий синтаксис:

а) заполнение данными при создании переменной:

let array_name: [dataType; size] = [value1, value2, value3];

б) указание данных по умолчанию и указание размера массива:

let array_name: [dataType; size] = [default_value_for_elements; size];

Пример объявления массива для ежечасного мониторинга давления в течении суток:

fn main() {
	let pressure: [u32; 24] = [0; 24];
	println!("{:?}", pressure);
}
Результат: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Можно было бы создать такой массив и первым способом, но представьте себе необходимость зарезервировать для массива 1000 значений. Второй способ инициализации массива гораздо компактнее.

При объявлении массива нельзя использовать переменную, но можно константу, т.к. длина массива должна быть известна во время компиляции.

let arr = [0; variable]; // Ошибка
let arr = [0; CONST]; // Успех

Получение значений элементов массива

Любое значение из массива можно получить по его индексу, аналогично как в кортежах. Но здесь индекс указывается в квадратных скобках []. Индекс начинается, как обычно, с нуля:

fn main() {
	let shopping: [&str; 5] = ["bread", "milk", "cheese", "apple", "noodles"];
	println!("{}", shopping[0]);
}
Результат: bread

Внимание. Нельзя использовать индекс выходящий за пределы массива!

Перебор значений в цикле

Также можно использовать цикл для прохождения по массиву

fn main() {
	let shopping: [&str; 5] = ["bread", "milk", "cheese", "apple", "noodles"];
	for p in 0..shopping.len() {
	 print!("{}  ", shopping[p]);
	}
}
Результат: bread milk cheese apple noodles

Здесь мы использовали метод .len() для вычисления длины массива (количества его значений). Запомните этот полезный метод.

Сам массив является итерируемым объектом, поэтому следующий код даст идентичный результат.

fn main() {
	let shopping: [&str; 5] = ["bread", "milk", "cheese", "apple", "noodles"];
	for p in shopping {
	 print!("{}  ", p);
	}
}
Результат: bread milk cheese apple noodles

Перебор значений в цикле с методом enumerate()

Для работы метода .enumerate() необходимо подготовить массив с помощью метода .iter().

fn main() {
	let shopping: [&str; 5] = ["bread", "milk", "cheese", "apple", "noodles"];
	for (i, p) in shopping.iter().enumerate() {
		println!("#{}: {}", i+1, p);
	}
}
Результат: #1: bread #2: milk #3: cheese #4: apple #5: noodles

Изменение значений массива

Ещё раз заметим, нельзя изменить длину массива, только значения его элементов.

Чтобы изменять значения массива, нужно объявить его мутабельным.

fn main() {
	let mut shopping: [&str; 5] = ["bread", "milk", "cheese", "apple", "noodles"];
	print!("В начале: {:?} ", shopping); println!();
	shopping[0] = "banana";
	print!("В конце: {:?} ", shopping);
}
Результат: В начале: ["bread", "milk", "cheese", "apple", "noodles"] В конце: ["banana", "milk", "cheese", "apple", "noodles"]

Срез массива

Это просто справочная информация. Срезы будем изучать в следующих курсах.

Срез – это произвольная часть массива. Можно объявить переменную и присвоить ей срез путем указания ссылки на массив и диапазона среза.

fn main() {
	let arr:[i32;4] = [1, 2, 3, 4];
	let slice_array:&[i32] = &arr[0..2];
	println!("Срез массива: {:?}", slice_array);
}
Результат: Срез массива: [1, 2]

Для просмотра заданий и решений, а также публикации своих решений необходимо зарегистрироваться на сайте.

Всё бесплатно, мы просто хотим с вами познакомиться и понять насколько актуально то, что мы делаем.

© Клют И. А., 2022. Копирование контента возможно только с письменного разрешения автора.