起步
初看《Rust 程序设计语言》第七章的模块管理时,完全有不知所云之感。看完就“懵”住,也不晓得 mod
要怎么用。上 B 站找相关视频,稍解惑,却未细讲单个文件如何拆分到多个文件。最后在 github 找到 rust 语言编写的项目,方如梦初醒。
我很喜欢这种一致性设计,也就简单说一下。
mod 关键字
在 rust 中,可用 mod 关键字划分代码作用域,使代码结构清晰。
mod 的基本使用:
// 学校
mod school {
// 教师
mod teacher {
fn num() -> i32 { // 返回教师人数
5
}
}
// 学生
mod student {
fn num() -> i32 { // 返回学生人数
120
}
}
}
上述示例代码就是一个层次清晰的树状结构。mod [module_name] { ... }
会划出一个代码块,将一类你认为可以放在一起的项放在一起。
Rust 中的项:函数、方法、结构体、枚举、模块和常量。
要使用模块中的函数,可用::
符号作为路径分割符。比方你要获取学校中教师的数量,代码可以如下:
school::teacher::num();
事实上,你想在 main 函数中使用 school::teacher::num()
是会编译出错的,你会得到:“this module is private”。mod 会在控制作用域的同时,控制私有性。默认情况下,模块中的内容均为私有,对外不可见。pub
关键字可改变这种默认行为。
mod school {
// 对外可见
pub mod teacher {
pub fn num() -> i32 {
5
}
}
// 对外不可见
mod student {
fn num() -> i32 {
120
}
}
// classroom 模块对外可见
pub mod classroom {
// num 函数对外不可见
fn num() -> i32 {
6
}
}
}
fn main() {
// school::teacher::num() **可**正常使用
let teacher_nums = school::teacher::num();
println!("{}", teacher_nums);
// school::student::num() **不可**正常使用
// let teacher_nums = school::student::num();
}
mod 还可以把 B 模块引入到 A 模块中。如上述代码,teacher 模块直接写到 school 模块,teacher 理所当然就在 school 里。你也可以把子模块写到“世界各地”,再用 mod 把它们组合起来:
pub mod s