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);
}