如何将路径列表传递给函数?

时间:2016-07-03 13:07:06

标签: rust

我想将目录名列表传递给函数, 像这样:

use std::path::Path;

fn test(dirs: &Vec<Path>) {}

fn main() {
    let dirs = vec![Path::new("/tmp"), Path::new("/var/tmp")];
    test(dirs);
}

但它没有编译:

<anon>:3:5: 4:6 error: the trait bound `[u8]: std::marker::Sized` is not satisfied [E0277]
<anon>:3     fn test(dirs: &Vec<Path>) {
<anon>:4     }
<anon>:3:5: 4:6 help: see the detailed explanation for E0277
<anon>:3:5: 4:6 note: `[u8]` does not have a constant size known at compile-time
<anon>:3:5: 4:6 note: required because it appears within the type `std::sys::os_str::Slice`
<anon>:3:5: 4:6 note: required because it appears within the type `std::ffi::OsStr`
<anon>:3:5: 4:6 note: required because it appears within the type `std::path::Path`
<anon>:3:5: 4:6 note: required by `std::vec::Vec`

看起来路径不是Sized

如果我不想将Vec<String>传递给函数,我应该如何解决这个问题? 也许PathBuf?如何以生锈的方式实现这一点?

1 个答案:

答案 0 :(得分:3)

实际上,Path是一种未经过类型化的类型,就像str一样。使用Path的唯一合理方法是引用它:&Path(就像&str)。所以你的例子看起来像这样:

use std::path::Path;

fn test(dirs: &[&Path]) {}

fn main() {
    let dirs = vec![Path::new("/tmp"), Path::new("/var/tmp")];
    test(&dirs);
}

并非我也将&Vec<_>更改为&[_]。对Vec的引用并不比切片(&[_])更强大,因此惯用的方法是传递切片而不是对向量的引用。

如果您不想将所有权转移到test功能,则上述解决方案是正确的方法。如果要转移所有权(包括实际保存路径数据的字符串缓冲区),则应使用PathBuf