面试题答案
一键面试模块划分与访问控制原理
在 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
中的功能。