考虑以下示例:
use std::env;
use std::path::Path;
fn main() {
let args: Vec<_> = env::args().collect();
let out_path: String = args[2];
let _path = Path::new(out_path);
}
这是我在编译时遇到的错误:
error[E0308]: mismatched types
--> main.rs:8:27
|
8 | let _path = Path::new(out_path);
| ^^^^^^^^
| |
| expected reference, found struct `std::string::String`
| help: consider borrowing here: `&out_path`
|
= note: expected type `&_`
found type `std::string::String`
现在,如果我遵循编译器的建议,我会得到:
error[E0507]: cannot move out of indexed content
--> main.rs:7:28
|
7 | let out_path: String = args[2];
| ^^^^^^^
| |
| cannot move out of indexed content
| help: consider using a reference instead: `&args[2]`
error: aborting due to previous error
在应用了建议之后,哪个导致了上一个错误:
error[E0308]: mismatched types
--> main.rs:7:28
|
7 | let out_path: String = &args[2];
| ^^^^^^^^
| |
| expected struct `std::string::String`, found reference
| help: consider removing the borrow: `args[2]`
|
= note: expected type `std::string::String`
found type `&std::string::String`
我如何了解情况并解决问题?
答案 0 :(得分:5)
这确实是一个不幸的建议序列(使用参考>删除该参考),但这是由与out_path
相关的手动类型归因引起的。
您需要一个字符串切片,而不是拥有的String
:
let out_path: &str = &args[2];
这既符合args
的限制(您不能移出索引内容),也符合Path::new
的要求,后者需要参考。
关于您的评论,一个clone()
“修复”了cannot move out of indexed content
错误,因为它不需要从args
向量开始移动,而是从其中复制了一个元素。当然,此修补程序不如仅借用它,后者也可以与Path::new
一起使用。