“无法摆脱索引内容”是什么意思?

时间:2015-01-12 14:59:30

标签: rust

我正在玩Rust,我试图使用此代码访问第一个命令行参数:

use std::env;

fn main() {
    let args: Vec<_> = env::args().collect();
    let dir = args[1];
}

我收到了这个错误:

error[E0507]: cannot move out of indexed content
 --> src/main.rs:5:15
  |
5 |     let dir = args[1];
  |         ---   ^^^^^^^ cannot move out of indexed content
  |         |
  |         hint: to prevent move, use `ref dir` or `ref mut dir`

如果我将其更改为let ref dir,它会编译,但我不知道发生了什么。有人可以解释什么&#34;索引内容&#34;装置

1 个答案:

答案 0 :(得分:53)

使用索引运算符([])时,您将获得索引位置的实际对象。您没有获得引用,指针或副本。由于您尝试使用let绑定绑定该对象,因此Rust会立即尝试移动(或复制,如果实现了Copy特征)。

在您的示例中,env::args()String的迭代器,然后将其收集到Vec<String>中。这是拥有的字符串的拥有向量,拥有的字符串不能自动复制。

您可以使用let ref绑定,但更惯用的替代方法是引用索引对象(请注意&符号):

use std::env;

fn main() {
    let args: Vec<_> = env::args().collect();
    let ref dir = &args[1];
    //            ^
}

不允许隐式移出Vec,因为它会使其处于无效状态 - 一个元素被移出,其他元素则不移出。如果您有一个可变的Vec,则可以使用Vec::remove之类的方法来获取单个值:

use std::env;

fn main() {
    let mut args: Vec<_> = env::args().collect();
    let dir = args.remove(1);
}

对于您的特定问题,您也可以使用Iterator::nth

use std::env;

fn main() {
    let dir = env::args().nth(1).expect("Missing argument");
}