rust_learn/module_learn/src/lib.rs

132 lines
6.1 KiB
Rust
Raw Normal View History

2024-06-08 15:01:12 +08:00
/*
rust library的单元包src/lib.rscargo new的时候创建的工程名
使 cargo build --lib
*/
//该模块位public的可以被外部的code进行导入使用
pub mod level0_mod1{
//定义一个public的函数可以暴露给外部调用
pub fn func(){
println!("This is level0_mod1::func");
//fun1属于本模块内的私有函数。模块内的code 是可以使用的,
fun1();
levl1_mod1::func();
//levl1_mod1::fun1是私有的只能在levl1_mod1 子模块内使用。
//levl1_mod1::fun1();
//levl2_mod1 是私有的只能在 levl1_mod2 模块内使用。不能被更外部的code使用
//levl1_mod2::levl2_mod1::func();
}
//定义一个私有的函数。外部不能直接使用只能模块内部的code可以使用
fn fun1() {
println!("This is level0_mod1::func1");
levl1_mod1::func();
}
//定义一个私有的模块。只能被同级的其他模块及其子模块调用不能被外部的code调用
mod levl1_mod1 {
pub fn func(){
println!("This is levl1_mod1::func");
self::fun1();
}
//这一一个私有模块中的私有函数。只能被同模块下的其他code调用不能被本模块外的code调用
fn fun1() {
println!("This is levl1_mod1::func1");
}
}
//定义一个公共的子模块。由于其父模块也是public的所以其可以被外部的code进行调用
pub mod levl1_mod2 {
pub fn func() {
println!("This is levl1_mod2::func");
levl2_mod1::func();
}
mod levl2_mod1 {
pub fn func(){
println!("This is levl2_mod1::func");
//可以使用绝对路径调用函数。根目录就是creat关键字相对于文件系统目录里面/
crate::level0_mod1::levl1_mod1::func();
//也可以使用相对路径进行调用
//self 相当于文件系统里面的 . 代表当前目录,也就是当前模块
//super 相当于文件系统里面的 .. 代表当前目录里的上一级目录,也就是父级模块
self::super::super::levl1_mod1::func();
//这个函数是 levl1_mod1 中私有的不能跨mod使用
//crate::level0_mod1::levl1_mod1::fun1();
//这样也是ok的表示同级模块下的其他函数
self::func1();
}
fn func1(){
println!("This is levl2_mod1::func1");
}
}
}
}
/*
使pub关键字
code进行调用使使
使
使API都定义到一个公共的mod中
pub的API的所述模块
使
*/
//本模块的函数
pub fn func(){
println!("This is level0_mod1::func");
}
//定义一个结构体并加上pub关键字使其暴露给外部使用。
pub struct struct1{
/* 即使结构体是pub的但是不加pub的成员依然是私有的 */
pub member1: i32, //该member是公有的外部可以访问到
member2:i32, //该member是私有的。外部无法访问到
}
impl struct1{
//公共的函数,可以被外部使用
pub fn func(){
println!("This is struct1->func");
}
//私有的函数,不可以被外部使用
fn func1(){
println!("This is struct1->func1");
}
}
//定义一个枚举并加上pub关键字使其暴露给外部使用。
//对于枚举来说 和模块以及struct不同只要枚举是pub的那么其变体也都是pub的
//因为只有只有所有变体都是pub的才能起到最大作用
pub enum enum1{
member1, //该member是公有的外部可以访问到
member2, //该member是公有的外部可以访问到
}
impl enum1 {
//公共的函数,可以被外部使用
pub fn func(){
println!("This is struct1->func");
}
//私有的函数,不可以被外部使用
fn func1(){
println!("This is struct1->func1");
}
}
/* 使用文件目录的形式拆分module以便于减小单个文件的代码量
lib.rs module同名的rs文件module的实现
module还存在子modulemodule同名的文件夹sub_module.rs存放sub_module的实现
src
bin #, rs文件
app1.rs
app2.rs
lib.rs #library lib.rs
tree0_mod1.rs #module tree0_mod1
tree0_mod1 # module tree0_mod1 module的实现源码存放目录
tree1_mod2.rs #module tree1_mod2 tree0_mod1 module
tree1_mod2 # module tree1_mod2 module的实现源码存放目录
tree2_mod1.rs #module tree2_mod1 tree1_mod2 module
*/
pub mod tree0_mod1;