Изменяемая итерация
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 12 из 66.
Иногда вам нужно делать больше, чем просто читать элементы вектора — вам нужно их изменять. В то время как предыдущий урок показал, как перебирать и читать значения, этот урок научит вас изменять элементы во время итерации, используя изменяемые ссылки.
Чтобы изменять элементы во время итерации, вам нужно использовать &mut вместо & в вашем цикле for:
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>)
Шпаргалка
Чтобы изменять элементы вектора во время итерации, используйте изменяемые ссылки с &mut:
let mut numbers = vec![1, 2, 3, 4];
for number in &mut numbers {
*number = *number * 2;
}Ключевые моменты:
&mut numbersсоздает изменяемую ссылку на вектор- Каждая итерация предоставляет изменяемую ссылку на отдельный элемент
- Оператор
*(оператор разыменования) обращается к фактическому значению и изменяет его - Вектор должен быть объявлен как
mut, чтобы разрешить изменение
Этот паттерн позволяет эффективно преобразовывать данные на месте без создания нового вектора.
Попробуйте сами
fn add_ten_to_all(numbers: Vec<i32>) -> Vec<i32> {
// Напишите код здесь
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
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Итоги: поиск элемента