我想在我的结构中持有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);
所以它不适合我。
答案 0 :(得分:4)
采用可以转换为Into
和PathBuf
的通用类型:
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");
}