“不能移出索引的含义是什么?

问题描述 投票:54回答:1

我正在玩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`

或在Rust的更高版本中:

error[E0507]: cannot move out of index of `std::vec::Vec<std::string::String>`
 --> src/main.rs:5:15
  |
5 |     let dir = args[1];
  |               ^^^^^^^
  |               |
  |               move occurs because value has type `std::string::String`, which does not implement the `Copy` trait
  |               help: consider borrowing here: `&args[1]`

如果将其更改为let ref dir,则会编译,但我不理解发生了什么。有人可以解释“索引内容”是什么意思吗?

rust
1个回答
54
投票

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

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

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

use std::env;

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

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

Vec::remove

对于您的特定问题,您也可以只使用use std::env; fn main() { let mut args: Vec<_> = env::args().collect(); let dir = args.remove(1); }

Iterator::nth
© www.soinside.com 2019 - 2024. All rights reserved.