模块
mod
#![allow(unused)]
mod foo {
pub fn print() {
println!("foo");
}
}
mod my {
pub fn print() {
println!("rust");
}
pub mod a {
// To call foo::print() from here:
// First 'super' accesses 'my' module's scope.
// Second 'super' accesses the crate root scope (parent of 'my').
use super::super::foo;
pub fn print() {
println!("a");
}
pub fn print_message_from_foo_via_a() {
foo::print(); // Calls foo::print() from the crate root
}
}
}
fn main() {
my::print();
my::a::print();
my::a::print_message_from_foo_via_a();
}
1.默认隐私设置:默认是私有。模块内的所有元素(函数、结构体、枚举、常量和其他模块)默认都是私有的。它们只能由同一模块或其直接子模块中的代码访问。
2.关键字pub:用于pub将某个项设为公共项,这意味着它可以从其定义模块外部访问。这适用于嵌套的模块声明本身(pub mod my_module),也适用于函数(pub fn my_func)、结构体(pub struct MyStruct)和单个结构体字段(pub field_name: Type)。
3.路径分隔符:::双冒号(::)用于导航模块层次结构和访问模块内的项(例如,my_module::my_sub_module::my_function())。
4.关键字use:引用作用域。此关键字将路径添加到当前作用域,允许您使用更短的名称引用项目。它通常与 <path> self、super<request> 或 crate 名称一起使用,以创建更便捷的路径。
5.关键字super“:” super指的是当前模块的父模块。它可以链式使用(例如,<class> super::super::),从而在模块层次结构中向上导航多个级别,进而访问祖先模块或同级模块中的项目。
6.建造者模式:可以对单个字段进行pub控制。 对于结构体,尤其是那些包含私有字段或复杂初始化逻辑的结构体,可以考虑提供公共构造函数(通常称为new或遵循建造者模式)。这可以增强封装性,并为创建结构体实例提供可控的接口。
创建库与模块
三处声明模块
Cargo.toml文件中要写上模块名字
[package]
name = "my_modules"
version = "0.1.0"
edition = "2024"
[dependencies]
单独建立src/lib.rs文件,并在其中声明模块
pub mod math;
pub mod util;
util文件夹包含多个模块,在src/util/mod.rs文件中声明这些模块
pub mod log;
pub mod vec;
模块文件
直接写方法,内容就行了,因为模块的声明已经在lib.rs和mod.rs中完成了
// /src/util/vec.rs
pub fn first(v: &[u32]) -> Option<u32> {
let n = v.len();
if n > 0 { Some(v[0]) } else { None }
}
pub fn last(v: &[u32]) -> Option<u32> {
let n = v.len();
if n > 0 { Some(v[n - 1]) } else { None }
}