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 根开始定位。
相对路径
相对路径从当前模块(即使用路径的位置)开始,使用 self、super 或直接以模块名开头。
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 周前
上一篇:5.1 模块与可见性
下一篇:5.3 使用 use 关键字引入作用域