在Rust中使用本地可变副本迭代数组

boi*_*ink 6 rust

我是Rust的初学者,在文档中找不到与此有关的任何内容。将不胜感激。C ++中的以下循环

for (const int i : {1,2,3,4,5})
  cout << i;
Run Code Online (Sandbox Code Playgroud)

大致翻译成

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

有没有办法写相当于

for (int i : {1,2,3,4,5}) {
  i += 1;
  cout << i;
}
Run Code Online (Sandbox Code Playgroud)

简而言之在Rust中?也就是说,是否有一个快捷方式可以对要迭代的内容进行本地可变复制?

mca*_*ton 5

是!

a的左侧for是模式。

为此,需要三种模式:

  • &pat 就像您已经拥有的一样,因为在迭代时会得到引用。
  • mut name创建可变的绑定。您当前正在使用name模式,该模式创建不可变的绑定,可以说是最简单的模式!
  • (pat) 括号可以用来消除子模式的歧义。

模式可以组合在一起,从而得到:

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

永久链接到操场

括号对于消除另一个模式是必不可少的,&mut pat这意味着绑定一个可变的引用,这是不一样的。

但是,我不会说这很常见,更常见的方法是执行以下两个步骤:

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

要么

for &i in &[1, 2, 3, 4, 5] {
    let mut i = i; // rebind as mutable
    i += 1;
    println!("{}", i);
}
Run Code Online (Sandbox Code Playgroud)

  • @boinkboink哦,的确很奇怪,在这种情况下,我更喜欢此https://play.rust-lang.org/?version=nightly&amp;mode=debug&amp;edition=2018&amp;gist=09e6e277be2b2db2db4e0563de386c980e7。 (2认同)