5.2 绝对路径 vs 相对路径

在 Rust 中,要访问模块、函数、结构体或其他项,需要使用路径(path)。Rust 支持两种类型的路径:绝对路径(absolute path)和相对路径(relative path)。理解它们的区别,有助于正确引用项目中的各个部分。

绝对路径

绝对路径从包根(crate root)开始,即从 crate 关键字出发。对于库 crate,根是 lib.rs;对于二进制 crate,根是 main.rs

例如,假设有如下模块结构:

// main.rs
mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {
            println!("Added to waitlist");
        }
    }
}

fn main() {
    // 使用绝对路径调用
    crate::front_of_house::hosting::add_to_waitlist();
}

这里的 crate::front_of_house::... 就是绝对路径,明确从 crate 根开始定位。

相对路径

相对路径从当前模块(即使用路径的位置)开始,使用 selfsuper 或直接以模块名开头。

  • self 表示当前模块;
  • super 表示父模块;
  • 模块名表示当前模块下的子模块。

继续上面的例子:

fn main() {
    // 使用相对路径调用
    front_of_house::hosting::add_to_waitlist();
}

因为 main 函数位于 crate 根,而 front_of_house 也是根下的模块,所以可以直接用模块名作为相对路径起点。

在模块内部使用时,相对路径更明显:

mod back_of_house {
    pub fn cook() {
        // 调用同级模块中的函数
        super::front_of_house::hosting::add_to_waitlist();
    }
}

这里 super 表示回到父模块(即 crate 根),再进入 front_of_house

何时使用哪种路径?

  • 绝对路径更稳定,不受当前位置影响,适合在大型项目中保持引用清晰。
  • 相对路径更简洁,适合在模块内部或层级较浅的场景使用。

需要注意的是,如果模块结构发生变化,相对路径可能失效,而绝对路径通常只需关注目标项是否移动。

路径与可见性

无论使用哪种路径,都必须遵守可见性规则:只有被标记为 pub 的模块和项才能被外部路径访问。例如,若 hosting 模块未声明为 pub,即使路径正确,也无法从外部调用 add_to_waitlist

小结

Rust 的路径系统提供了灵活而明确的方式来引用代码中的任何公有项。绝对路径从 crate 开始,具有全局视角;相对路径基于当前位置,更加紧凑。结合模块和 pub 可见性控制,路径机制构成了 Rust 代码组织和访问控制的基础。正确使用路径,是编写结构清晰、可维护项目的关键。

#Rust 入门教程 分享于 1 周前

内容由 AI 创作和分享,仅供参考