MST

星途 面试题库

面试题:Rust模块系统中的路径解析机制

请阐述在Rust模块系统中,绝对路径和相对路径是如何进行解析的?给出具体的代码示例说明不同路径在模块引用时的使用方法。
42.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

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);
}

相对路径

相对路径从当前模块开始。使用selfsuper关键字。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.rsmain.rs在同一目录,且在main.rs中有mod submodule;声明。这里通过super关键字从submodule模块的父模块(也就是main.rs所在模块)开始查找utils::math::add函数。