跳到主要内容

模块

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 }
}
📢 Share this article