MST

星途 面试题库

面试题:Rust模块可见性在复杂项目结构中的应用

假设你正在开发一个具有多层模块结构的Rust项目,其中一些模块包含敏感数据处理逻辑,要求外部模块只能通过特定的接口函数访问这些敏感逻辑。请设计一个模块结构并编写相应代码来实现这种可见性控制,解释每一步的设计思路。
12.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

模块结构设计思路

  1. 创建项目结构:在Rust项目中,一般以src目录为源代码根目录。我们将创建不同的模块文件来组织代码。
  2. 定义敏感数据处理模块:这个模块负责处理敏感数据逻辑,将其内部细节隐藏起来,只暴露特定接口给外部模块。
  3. 定义公共接口模块:此模块提供外部模块可以调用的接口函数,这些函数内部调用敏感数据处理模块的逻辑。

代码实现

  1. 项目结构
    • src/
      • main.rs
      • sensitive.rs
      • public_api.rs
  2. sensitive.rs代码
// 定义敏感数据处理模块
mod sensitive {
    // 假设这是一个处理敏感数据的函数,不希望外部模块直接调用
    fn process_sensitive_data(data: &str) -> String {
        format!("Processed sensitive data: {}", data)
    }

    // 定义一个供外部模块调用的接口函数
    pub fn public_sensitive_api(data: &str) -> String {
        process_sensitive_data(data)
    }
}

// 使sensitive模块中的public_sensitive_api函数可以在crate根被访问
pub use sensitive::public_sensitive_api;
  1. public_api.rs代码
// 公共接口模块,调用敏感数据处理模块的公共接口
pub fn call_sensitive_api(data: &str) -> String {
    crate::sensitive::public_sensitive_api(data)
}
  1. main.rs代码
mod sensitive;
mod public_api;

fn main() {
    let data = "Some sensitive input";
    let result = public_api::call_sensitive_api(data);
    println!("{}", result);
}

解释

  • sensitive.rs
    • 首先定义了一个内部函数process_sensitive_data,这个函数处理敏感数据,但由于没有pub关键字,外部模块无法直接访问。
    • 然后定义了public_sensitive_api函数并标记为pub,它作为外部模块访问敏感数据处理逻辑的接口。
    • 使用pub usepublic_sensitive_api函数提升到sensitive模块的父级作用域(在这个例子中是crate根),方便其他模块调用。
  • public_api.rs
    • call_sensitive_api函数作为更外层的公共接口,它调用crate::sensitive::public_sensitive_api函数,这样进一步封装了敏感数据处理模块的调用,外部模块只需要调用public_api::call_sensitive_api
  • main.rs
    • 引入sensitivepublic_api模块。
    • 通过public_api::call_sensitive_api函数来处理敏感数据,无法直接访问sensitive模块内部的process_sensitive_data函数,实现了可见性控制。