如何在结构体中正确存储不可变路径?

32

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

  • 我应该使用 Path 还是 PathBuf
  • 我应该使用 AsRef 吗?
  • 我需要使用 PathBuf::from(path) 使路径被结构体拥有吗?

  • 我应该使用 Path 还是 PathBuf
  • 我应该使用 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);
}

一些背景:我试图在文件上建立一个高级抽象,它应该知道自己的路径。也许这个设计本身就有问题。

1个回答

40

这个问题与 String vs &str 几乎相同。 PathBufString&Path&str。所以:

如果你想使结构体拥有路径,请存储 PathBuf。如果你不确定自己需要什么,请从这里开始。

如果你只需要引用一个路径,请存储 &Path。根据你的具体操作,这可能是你需要的,但如果你不确定,那可能不正确。


2
Box<Path> 是另一个选择。由于它表示不可变性,因此也值得考虑。 - David J.
这是可能的,但我认为在我写 Rust 的所有年份中都没有见过这样的事情。 - Steve Klabnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接