Изменяемая итерация
Часть раздела Логика и управление потоком путешествия по Rust на Coddy. Урок 12 из 66.
Иногда нужно не просто читать элементы вектора — их нужно изменять. В предыдущем уроке было показано, как перебирать элементы и читать значения, а в этом уроке ты узнаешь, как изменять элементы во время перебора с помощью изменяемых ссылок.
Чтобы изменять элементы во время итерации, в цикле for нужно использовать &mut вместо &:
let mut numbers = vec![1, 2, 3, 4];
for number in &mut numbers {
*number = *number * 2;
}&mut numbers создаёт изменяемую ссылку на вектор, а на каждой итерации вы получаете изменяемую ссылку на отдельный элемент. Оператор * (называемый оператором разыменования) используется для доступа к фактическому значению, на которое указывает ссылка, и его изменения.
Этот шаблон невероятно полезен для преобразования данных на месте. Вместо создания нового вектора с изменёнными значениями вы можете эффективно обновить существующий. Вектор должен быть объявлен как mut, чтобы это работало, поскольку вы изменяете его содержимое.
После приведённого выше цикла numbers содержал бы [2, 4, 6, 8] — каждое исходное значение удвоено на месте.
Задание
ЛегкоНапиши функцию add_ten_to_all, которая принимает изменяемый вектор numbers, добавляет 10 к каждому элементу непосредственно, а затем возвращает изменённый вектор.
Используй изменяемую итерацию с &mut, чтобы напрямую изменять каждый элемент. Не забудь использовать оператор разыменования *, чтобы обращаться к фактическим значениям и изменять их.
Параметры:
numbers(Vec<i32>): Изменяемый вектор целых чисел для изменения
Возвращаемое значение: Изменённый вектор, к каждому элементу которого добавлено 10 (Vec<i32>)
Попробуйте сами
fn add_ten_to_all(mut numbers: Vec<i32>) -> Vec<i32> {
// Напишите код здесь
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элементаПотренируйтесь самостоятельно: Онлайн-компилятор Rust