如何编写一个返回Vec <path>的函数?

时间:2016-05-25 13:54:23

标签: rust

我正在阅读文档并尝试编写一些基本文件I / O代码作为工具来帮助我学习Rust。

以下内容无法编译:

use std::fs;
use std::io;
use std::path::Path;

pub fn read_filenames_from_dir<P>(path: P) -> Result<Vec<Path>, io::Error>
where
    P: AsRef<Path>,
{
    let paths = try!(fs::read_dir(path));
    Ok(paths.unwrap())
}

编译错误:

error[E0277]: the trait bound `[u8]: std::marker::Sized` is not satisfied in `std::path::Path`
  --> src/main.rs:5:1
   |
5  | / pub fn read_filenames_from_dir<P>(path: P) -> Result<Vec<Path>, io::Error>
6  | | where
7  | |     P: AsRef<Path>,
8  | | {
9  | |     let paths = try!(fs::read_dir(path));
10 | |     Ok(paths.unwrap())
11 | | }
   | |_^ `[u8]` does not have a constant size known at compile-time
   |
   = help: within `std::path::Path`, the trait `std::marker::Sized` is not implemented for `[u8]`
   = note: required because it appears within the type `std::path::Path`
   = note: required by `std::vec::Vec`

如何编写此函数以返回传入的Path内的Path集合?

1 个答案:

答案 0 :(得分:8)

你没有。 Path是一种没有大小的类型,只能通过间接使用(例如&PathBox<Path>)。在这个意义上,它就像类型str[u8] - 两者都不能直接使用,只能间接使用。

您可能想要的是PathBuf,它代表拥有的路径。它相当于String的{​​{1}}和&str的{​​{1}}。

更改返回类型后,必须正确映射迭代器的结果以创建所需的类型:

Vec<u8>