Path 在结构中存储不可变路径的正确方法是什么?

Path 在结构中存储不可变路径的正确方法是什么?,path,rust,ownership,Path,Rust,Ownership,下面的代码可以工作,但不确定是否正确。有几个问题: 我应该使用Path还是PathBuf 我应该使用AsRef 我是否需要PathBuf::from(path)才能使结构拥有路径 一些上下文:我试图对一个应该知道自己路径的文件进行高级抽象。也许设计是完全错误的。这个问题几乎与Stringvs&str相同,如果这有帮助的话PathBuf是String,&Path是&str。因此: 如果希望结构拥有它,请存储一个PathBuf。如果你不知道你想要什么,从这里开始 如果只需要路径的引用,请存储路径

下面的代码可以工作,但不确定是否正确。有几个问题:

  • 我应该使用
    Path
    还是
    PathBuf
  • 我应该使用
    AsRef
  • 我是否需要
    PathBuf::from(path)
    才能使结构拥有路径

一些上下文:我试图对一个应该知道自己路径的文件进行高级抽象。也许设计是完全错误的。

这个问题几乎与
String
vs
&str
相同,如果这有帮助的话
PathBuf
String
&Path
&str
。因此:

如果希望结构拥有它,请存储一个
PathBuf
。如果你不知道你想要什么,从这里开始


如果只需要路径的引用,请存储路径。根据您所做的,这可能是您想要的,但如果您不知道,则可能不正确。

Box
是另一种选择。因为它标志着不变性,所以它也值得考虑。确实如此,但我认为在我多年的写作生涯中,我从来没有见过这种不变性。
use std::fmt;
use std::path::PathBuf;

struct Example {
    path: PathBuf,
}

impl fmt::Display for Example {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self.path.to_str().unwrap())
    }
}

impl Example {

    fn new(path: &PathBuf) -> Example {
        // Do something here with path.
        Example {
            path: PathBuf::from(path),
        }
    }
}

fn main() {
    let x = Example::new(&PathBuf::from("test.png"));
    println!("{}", x);
}