为什么连接路径完全取代Rust中的原始路径?

Pet*_*ron 3 filepath rust

我不明白Rust如何连接文件路径.为什么这不起作用:

fn main() {
    let root = std::path::Path::new("resources/");
    let uri = std::path::Path::new("/js/main.js");
    let path = root.join(uri);
    assert_eq!(path.to_str(), Some("resources/js/main.js"));
}
Run Code Online (Sandbox Code Playgroud)

失败了:

thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `Some("/js/main.js")`,
 right: `Some("resources/js/main.js")`', src/main.rs:5:5
Run Code Online (Sandbox Code Playgroud)

我在文档中看到"推动绝对路径取代现有路径",但这似乎是一个可怕的想法,会吸引很多人.

在这种情况下,我如何安全地剥离绝对路径,或使其相对?

hel*_*low 5

这是因为"/js/main.js"被视为绝对路径(doc)

如果path是绝对路径,则它将替换当前路径.

在Windows上:

  • 如果path有一个根但没有前缀(例如\ windows),它将替换除前缀(如果有)之外的所有内容self.
  • 如果path有前缀但没有root,则替换self.

如果您将示例更改为"js/main.js"然后使用join,它将被正确构建(游乐场)

  • @TimDiekmann引用[doc](https://crates.io/crates/path-absolutize):*"absolutize和canonicalize方法之间的区别在于绝对值并不关心文件是否存在以及文件是什么. "*;) (2认同)
  • @PetrusTheron 您可以使用 [`Path::strip_prefix`](https://doc.rust-lang.org/stable/std/path/struct.Path.html#method.strip_prefix) 删除前导 `/`: [游乐场](https://play.integer32.com/?version=stable&mode=release&edition=2015&gist=b67cfdcb0ccfa3814a953fa5e0626cd3) (2认同)