Vec <PathBuf>到&[&Path]没有分配吗?

use*_*932 2 reference slice rust

我有返回的Vec<PathBuf>函数和接受的函数&[&Path],基本上是这样的:

use std::path::{Path, PathBuf};

fn f(paths: &[&Path]) {
}

fn main() {
    let a: Vec<PathBuf> = vec![PathBuf::from("/tmp/a.txt"), PathBuf::from("/tmp/b.txt")];

    f(&a[..]);
}
Run Code Online (Sandbox Code Playgroud)

是否可以在没有内存分配的情况下转换Vec<PathBuf>&[&Path]

如果不是,我应该如何更改f签名以接受带有Path和的切片PathBuf

She*_*ter 5

是否可以在没有内存分配的情况下转换Vec<PathBuf>&[&Path]

不,正如我如何编写一个同时拥有和不拥有字符串集合的函数所回答的那样?; a PathBuf和a Path具有不同的内存布局(答案使用Stringstr;概念相同)。

我应该如何更改f签名以接受带有Path和的切片PathBuf

再次如我如何编写同时拥有和不拥有字符串集合的函数中所建议,使用AsRef

use std::path::{Path, PathBuf};

fn f<P>(paths: &[P])
    where P: AsRef<Path>
{}

fn main() {
    let a = vec![PathBuf::from("/tmp/a.txt")];
    let b = vec![Path::new("/tmp/b.txt")];

    f(&a);
    f(&b);
}
Run Code Online (Sandbox Code Playgroud)

这不需要额外的堆分配。