为什么我不能将字符串从env :: Args传递给Path :: new?

时间:2018-09-26 10:57:47

标签: rust

考虑以下示例:

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`

我如何了解情况并解决问题?

1 个答案:

答案 0 :(得分:5)

这确实是一个不幸的建议序列(使用参考>删除该参考),但这是由与out_path相关的手动类型归因引起的。

您需要一个字符串切片,而不是拥有的String

let out_path: &str = &args[2];

这既符合args的限制(您不能移出索引内容),也符合Path::new的要求,后者需要参考。

关于您的评论,一个clone()“修复”了cannot move out of indexed content错误,因为它不需要从args向量开始移动,而是从其中复制了一个元素。当然,此修补程序不如仅借用它,后者也可以与Path::new一起使用。