【问题标题】:Why does joining paths completely replace the original path in Rust?为什么加入路径会完全取代 Rust 中的原始路径?
【发布时间】:2018-11-22 11:50:35
【问题描述】:

我不明白 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"));
}

失败:

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

我在the docs 中看到“推送绝对路径替换现有路径”,但这似乎是一个糟糕的想法,会吸引很多人。

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

【问题讨论】:

标签: rust filepath


【解决方案1】:

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

如果路径是绝对路径,则替换当前路径。

在 Windows 上:

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

如果您将示例更改为"js/main.js",然后使用join,它将正确构造(playground

【讨论】:

  • 谢谢,那么如何将传入路径始终视为相对路径?
  • 仅供参考:os.path.join 在 Python 中具有相同的行为。我不确定为什么,但至少那里有一些一致性。
  • @PetrusTheron 我建议不要使用/。您可以完全省略它们。
  • @TimDiekmann 引用doc“absolutize 和 canonicalize 方法之间的区别在于,absolutize 不关心文件是否存在以及文件到底是什么。” ;)
  • @PetrusTheron 您可以使用Path::strip_prefix 删除前导/playground
猜你喜欢
  • 2016-01-23
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2011-04-05
  • 2017-03-16
  • 2014-08-02
相关资源
最近更新 更多