面试题答案
一键面试Rust模块系统中的路径解析
绝对路径
绝对路径从crate
根开始。在一个二进制crate
中,crate
根就是main.rs
,在一个库crate
中,crate
根就是lib.rs
。使用crate
关键字来表示crate
根。
例如,假设有如下项目结构:
src/
├── main.rs
└── utils/
└── math.rs
在math.rs
中有一个函数add
:
// src/utils/math.rs
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
在main.rs
中通过绝对路径引用add
函数:
// src/main.rs
mod utils;
fn main() {
let result = crate::utils::math::add(2, 3);
println!("The result is: {}", result);
}
相对路径
相对路径从当前模块开始。使用self
、super
关键字。self
代表当前模块,super
代表当前模块的父模块。
假设项目结构不变,在math.rs
中再定义一个函数subtract
,并在该文件中通过相对路径调用add
函数:
// src/utils/math.rs
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
pub fn subtract(a: i32, b: i32) -> i32 {
let add_result = self::add(a, b);
add_result - b
}
如果想在main.rs
的一个子模块中通过相对路径引用math
模块中的函数,可以这样做。先在main.rs
中创建一个子模块:
// src/main.rs
mod utils;
mod submodule;
fn main() {
let result = crate::utils::math::add(2, 3);
println!("The result is: {}", result);
}
// submodule.rs
mod utils;
fn submodule_function() {
let result = super::utils::math::add(5, 3);
println!("Submodule result: {}", result);
}
假设submodule.rs
和main.rs
在同一目录,且在main.rs
中有mod submodule;
声明。这里通过super
关键字从submodule
模块的父模块(也就是main.rs
所在模块)开始查找utils::math::add
函数。