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

Her*_*nan 9 path ownership rust

以下代码有效,但不确定它是否正确.几个问题:

  • 我应该使用PathPathBuf
  • 我应该用AsRef吗?
  • 我需要PathBuf::from(path)为了拥有结构所拥有的路径吗?
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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*nik 11

这个问题与Stringvs 几乎相同&str,如果这有帮助的话.PathBufString,&Path&str.所以:

PathBuf如果您希望结构拥有它,请存储a .如果您不知道自己想要什么,请从这里开始.

&Path如果您只想要引用路径,请存储a .根据你正在做的事情,这可能是你想要的,但如果你不知道,它可能不正确.

  • `Box<Path>` 是另一种选择。由于它标志着不变性,因此也值得考虑。 (2认同)