Разыменование и повторная ссылка на Box
:
use std::path::Path;
fn main() {
fn polymorphic(_: impl AsRef<Path>) {}
let boxed: Box<dyn AsRef<Path>> = Box::new("/foo/bar");
polymorphic(&*boxed);
}
Это означает, что он должен быть сохранен как Box<dyn AsRef<Path>>
Нет, это не так. Документация Path
гласит (выделено мое):
Это тип без размера, означающий, что он всегда должен использоваться за указателем, таким как &
или Box
. Для собственной версии этого типа см. PathBuf
.
use std::path::{Path, PathBuf};
fn polymorphic(_: impl AsRef<Path>) {}
struct Example(PathBuf);
impl Example {
fn new(path: impl AsRef<Path>) -> Self {
Self(path.as_ref().to_owned())
}
fn example(&self) {
polymorphic(&self.0)
}
}
Я бы на самом деле использовал Into<PathBuf>
сам, так как это позволяет кому-то чтобы дать мне право собственности на то, что им больше не нужно:
use std::path::{Path, PathBuf};
fn polymorphic(_: impl AsRef<Path>) {}
struct Example(PathBuf);
impl Example {
fn new(path: impl Into<PathBuf>) -> Self {
Self(path.into())
}
fn example(&self) {
polymorphic(&self.0)
}
}