Итерация массива с локальной изменяемой копией в Rust - PullRequest
6 голосов
/ 28 июня 2019

Я новичок в Rust и не могу найти что-либо по этому поводу в документации. Буду признателен за любую помощь. Следующий цикл в C ++

for (const int i : {1,2,3,4,5})
  cout << i;

примерно переводится как

for &i in &[1,2,3,4,5] {
    println!("{}", i);
}

Есть ли способ написать эквивалент

for (int i : {1,2,3,4,5}) {
  i += 1;
  cout << i;
}

в Rust кратко? А именно, есть ли сокращение для создания локальной изменяемой копии того, что итерируется?

1 Ответ

5 голосов
/ 28 июня 2019

Да!

Левая часть for является шаблоном.

Для этого вам нужно три шаблона:

  • &pat как у вас уже есть, потому что вы получаете ссылки при итерации.
  • mut name, который создает изменяемую привязку. В настоящее время вы используете шаблон name, который создает неизменную привязку, возможно, самый простой из шаблонов!
  • (pat), где скобки могут использоваться для устранения неоднозначности подшаблонов.

Шаблоны могут быть объединены вместе, что даст:

for &(mut i) in &[1, 2, 3, 4, 5] {
    i += 1;
    println!("{}", i);
}

( Постоянная ссылка на игровую площадку )

Скобки необходимы для устранения неоднозначности с другим шаблоном &mut pat, что означает привязку изменяемой ссылки, которая не совпадает.

Однако я бы не сказал, что это очень распространено, и более распространенным способом было бы сделать это два шага:

for &i in &[1, 2, 3, 4, 5] {
    let i = i + 1;
    println!("{}", i);
}

или

for &i in &[1, 2, 3, 4, 5] {
    let mut i = i; // rebind as mutable
    i += 1;
    println!("{}", i);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...