接受与Path兼容的类型以生成PathBuf?

时间:2018-02-13 17:50:07

标签: rust

我想在我的结构中持有PathBuf

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

struct Foo {
    p: PathBuf,
}

impl Foo {
    fn new(p: PathBuf) -> Foo {
        Foo { p }
    }
}

这样的内容适用于Foo::new(Path::new("a").join("b")),但我也想支持Foo::new(Path::new("a"))

fn main() {
    Foo::new(Path::new("a").join("b"));
    // Foo::new(Path::new("a"));
}

我该怎么办?是否可以使用一种方法实现,还是应该使用两种方法?我知道P: AsRef<Path>,但在

的情况下看起来需要额外的副本
let p: PathBuf = Path::new("a").join("b");
let foo = Foo::new(p);

所以它不适合我。

1 个答案:

答案 0 :(得分:4)

采用可以转换为IntoPathBuf的通用类型:

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

struct Foo {
    p: PathBuf,
}

impl Foo {
    fn new<P>(p: P) -> Foo
    where
        P: Into<PathBuf>,
    {
        Foo { p: p.into() }
    }
}

fn main() {
    Foo::new(Path::new("a").join("b"));
    Foo::new(Path::new("a"));
    Foo::new("a");
}