Menu
Coddy logo textTech

Заимствование в цикле

Часть раздела Fundamentals путешествия по Rust на Coddy — урок 67 из 75.

Когда мы пишем цикл в Rust, у нас есть два основных способа работы с данными: мы можем просматривать их (используя &) или забирать их. Например, рассмотрим следующие данные:

let numbers = vec![1, 2, 3, 4, 5];
let mut sum = 0;

Способ 1: Просмотр данных (используя &):

for number in &numbers {
    sum += number;
}
println!("I can use it here: {:?}", numbers);

Способ 2: Получение данных (без &):

for number in numbers {
    sum += number;
}
// println!("Can't use {:?} anymore!", numbers);
// Это приведет к ошибке

Представьте это так:

  1. Использование & похоже на просмотр фотоальбома: вы можете видеть все фотографии, но сам альбом остается нетронутым
  1. Не использовать & — это все равно что вынимать фотографии: вы можете ими пользоваться, но после этого альбом останется пустым

Теперь этот стиль:

for num in numbers.iter() {}

Это аналогично следующему:

for num in &numbers {}

И цикл с изменением:

for num in numbers.iter_mut() { 
    *num *= 2;
}

Это также можно записать так:

for num in &mut numbers { 
    *num *= 2;
}

Шпаргалка

В циклах Rust вы можете либо просматривать данные (используя &), либо забирать владение ими:

Просмотр данных (заимствование):

let numbers = vec![1, 2, 3, 4, 5];
for number in &numbers {
    sum += number;
}
// numbers всё ещё можно использовать после цикла

Получение владения:

let numbers = vec![1, 2, 3, 4, 5];
for number in numbers {
    sum += number;
}
// numbers нельзя использовать после цикла

Методы итератора:

// Эти варианты эквивалентны:
for num in numbers.iter() {}
for num in &numbers {}

// Для изменения:
for num in numbers.iter_mut() { *num *= 2; }
for num in &mut numbers { *num *= 2; }

Попробуйте сами

В этом уроке нет задания по программированию.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Fundamentals