Как я могу сделать изменяемое заимствование в цикле for?

Я старался:

fn main() {
    let mut vec = [1, 2, 3];
    
    for mut x in &vec { *x = 3; }
    for mut &x in &vec { x = 3; }
    for mut *x in &vec { x = 3; }
    for mut x in mut &vec { *x = 3; }
    for mut x in &(mut vec) { *x = 3; }
}

Ни один из них не работает; Как я должен это делать?

Я получаю такие ошибки, как:

  • mut должен быть прикреплен к каждой отдельной привязке
  • ожидаемый идентификатор, найдено *
  • ожидаемое выражение, найдено ключевое слово mut
  • невозможно назначить *x, который находится за ссылкой &

person ZisIsNotZis    schedule 21.09.2016    source источник


Ответы (1)


Вы можете перечитать Язык программирования Rust, в частности разделы:

Мы также можем перебирать изменяемые ссылки на каждый элемент изменяемого вектора, чтобы внести изменения во все элементы. Цикл for в листинге 8-9 добавит 50 к каждому элементу.

let mut v = vec![100, 32, 57];
for i in &mut v {
    *i += 50;
}

Листинг 8-9. Перебор изменяемых ссылок на элементы в векторе

Чтобы изменить значение, на которое ссылается изменяемая ссылка, мы должны использовать оператор разыменования (*), чтобы получить значение в i, прежде чем мы сможем использовать оператор +=.

Кроме того, вы можете вызвать метод iter_mut:

let mut v = vec![100, 32, 57];
for i in v.iter_mut() {
    *i += 50;
}

Смотрите также:


Обратите внимание, что ваша переменная не является вектором. Это массив.

person Shepmaster    schedule 21.09.2016
comment
Спасибо. Я полностью пропустил версию без скобок для for mut x in &(mut vec) - person ZisIsNotZis; 21.09.2016