MST
星途 面试题库

面试题:Rust模块的复杂组织与可见性控制

假设有一个较大规模的Rust项目,要求构建一个模块体系,包含`core`模块,`core`模块下又有`submodule1`和`submodule2`子模块。`submodule1`中的函数需要调用`submodule2`中的特定函数,同时`main`模块要能调用`core`模块中的某些公开函数。请详细说明模块的组织方式、可见性修饰符的使用以及相应的`import`语句。并且解释如果在`submodule1`中尝试调用`submodule2`中未正确设置可见性的函数会出现什么错误以及如何解决。
15.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

模块组织方式

  1. 在项目根目录下的 src 目录中,一般会有一个 main.rs 文件作为项目入口。如果项目规模较大,还可以使用 lib.rs 文件来定义库模块。假设这是一个库项目,在 src/lib.rs 中定义模块结构:
// src/lib.rs
pub mod core {
    pub mod submodule1;
    pub mod submodule2;
}
  1. src/core 目录下分别创建 submodule1.rssubmodule2.rs 文件:
mkdir src/core
touch src/core/submodule1.rs
touch src/core/submodule2.rs

可见性修饰符及 import 语句

  1. submodule1 调用 submodule2 函数
    • submodule2.rs 中,将需要被 submodule1 调用的函数设置为 pub(公开)。例如:
// src/core/submodule2.rs
pub fn submodule2_function() {
    println!("This is submodule2_function");
}
  • submodule1.rs 中,通过 use 语句引入 submodule2 中的函数:
// src/core/submodule1.rs
use crate::core::submodule2::submodule2_function;

pub fn submodule1_function() {
    submodule2_function();
    println!("This is submodule1_function");
}
  1. main 模块调用 core 模块公开函数
    • core 模块的某个子模块(例如 submodule1)中,将需要被 main 模块调用的函数设置为 pub。假设在 submodule1.rs 中已经有 pub fn submodule1_function()
    • main.rs 中引入 core 模块及其公开函数:
// src/main.rs
use crate::core::submodule1::submodule1_function;

fn main() {
    submodule1_function();
}

错误及解决办法

如果在 submodule1 中尝试调用 submodule2 中未正确设置可见性的函数,会出现编译错误,类似于:

error[E0603]: function `non_public_function` is private
 --> src/core/submodule1.rs:X:Y
  |
X |     non_public_function();
  |     ^^^^^^^^^^^^^^^^^^^^^ private function

解决办法就是将 submodule2 中需要被 submodule1 调用的函数设置为 pub 公开函数,如上述 submodule2.rs 中的示例。