MST
星途 面试题库

面试题:Rust模块系统中如何实现模块的嵌套与访问控制

在Rust中,假设你有一个项目需要实现模块的嵌套结构,外层模块包含内层模块,并且内层模块中的某些函数或结构体只能被外层模块访问,不能被其他模块随意调用。请描述实现这种结构的方法,并给出相应的代码示例。
22.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,可以通过mod关键字来定义模块,使用pub关键字来控制模块内函数和结构体的可见性。对于只能被外层模块访问的函数或结构体,不使用pub关键字声明。

示例代码如下:

// 外层模块
mod outer {
    // 内层模块
    mod inner {
        // 只能被外层模块访问的函数
        fn inner_function() {
            println!("This is an inner function.");
        }

        // 只能被外层模块访问的结构体
        struct InnerStruct {
            data: i32,
        }

        impl InnerStruct {
            fn new(data: i32) -> InnerStruct {
                InnerStruct { data }
            }
        }

        // 内层模块中对外可见的函数,用于调用内层不可见的函数和结构体
        pub fn call_inner() {
            let inner_struct = InnerStruct::new(42);
            inner_function();
            println!("Inner struct data: {}", inner_struct.data);
        }
    }

    // 外层模块中可调用内层模块函数
    pub fn outer_function() {
        inner::call_inner();
    }
}

fn main() {
    // 调用外层模块函数
    outer::outer_function();
}

在上述代码中:

  1. outer模块是外层模块,包含inner内层模块。
  2. inner模块中的inner_functionInnerStruct没有使用pub关键字,因此它们只能被inner模块内部以及包含它们的outer模块访问。
  3. inner模块中的call_inner函数使用pub关键字,这样outer模块可以通过inner::call_inner调用它,间接调用inner_functionInnerStruct
  4. outer模块中的outer_function函数使用pub关键字,这样在main函数中可以通过outer::outer_function调用它,进而执行内层模块的功能。