Как правильно хранить неизменяемый путь в структуре?

Следующий код работает, но не уверен, что это правильный путь. Несколько вопросов:

  • Должен ли я использовать 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 ответ

Решение

Этот вопрос почти такой же, как String против &str, если это поможет. PathBuf является String, &Path является &str, Так:

Магазин PathBuf если вы хотите, чтобы структура владела им. Если вы не знаете, чего хотите, начните здесь.

Магазин &Path если вы просто хотите ссылку на путь. В зависимости от того, что вы делаете, это может быть то, что вы хотите, но если вы не знаете, это, вероятно, не правильно.

Другие вопросы по тегам