MST

星途 面试题库

面试题:Rust 模块化设计下结构体及其关联函数的访问控制

在 Rust 模块化编程中,假设存在一个结构体及其关联函数,如何通过合理的模块划分和访问控制(如 pub 关键字等),使得不同模块能够正确且安全地使用这些结构体和关联函数?请详细描述并给出代码示例,包含至少两个模块的设计。
41.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

模块划分与访问控制原理

在 Rust 中,通过 mod 关键字定义模块,使用 pub 关键字来控制结构体、函数等的可见性。要使不同模块能使用结构体及其关联函数,需将结构体和关联函数标记为 pub,并且确保模块路径正确。

代码示例

假设项目结构如下:

src/
├── main.rs
└── utils/
    └── mod.rs

utils/mod.rs

// 定义一个结构体,标记为pub使其可被外部模块访问
pub struct MyStruct {
    data: i32,
}

impl MyStruct {
    // 关联函数也标记为pub
    pub fn new(data: i32) -> Self {
        MyStruct { data }
    }

    pub fn get_data(&self) -> i32 {
        self.data
    }
}

main.rs

// 引入utils模块
mod utils;

fn main() {
    // 使用utils模块中的MyStruct结构体及其关联函数
    let my_struct = utils::MyStruct::new(42);
    println!("Data from MyStruct: {}", my_struct.get_data());
}

更复杂的多模块示例

假设项目结构如下:

src/
├── main.rs
├── utils/
│   ├── mod.rs
│   └── sub_utils/
│       └── mod.rs

utils/mod.rs

// 导出sub_utils模块
pub mod sub_utils;

// 定义一个结构体,标记为pub使其可被外部模块访问
pub struct MyStruct {
    data: i32,
}

impl MyStruct {
    // 关联函数也标记为pub
    pub fn new(data: i32) -> Self {
        MyStruct { data }
    }

    pub fn get_data(&self) -> i32 {
        self.data
    }
}

utils/sub_utils/mod.rs

use super::MyStruct;

pub fn use_my_struct() {
    let my_struct = MyStruct::new(10);
    println!("Data in sub_utils: {}", my_struct.get_data());
}

main.rs

mod utils;

fn main() {
    let my_struct = utils::MyStruct::new(42);
    println!("Data from MyStruct in main: {}", my_struct.get_data());

    utils::sub_utils::use_my_struct();
}

在上述示例中,MyStruct 及其关联函数通过 pub 关键字在不同模块间实现了正确且安全的访问。在复杂示例中,sub_utils 模块可以通过 super 关键字访问 utils 模块中的 MyStruct,而 main 函数可以访问 utils 模块及其子模块 sub_utils 中的功能。