rust_learn/module_learn/src/lib.rs
2024-06-08 15:01:12 +08:00

132 lines
6.1 KiB
Rust
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
rust 只可以有一个library的单元包文件的路径必须是src/lib.rs。包名就是cargo 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还存在子module那就再建立和module同名的文件夹在文件夹里面建立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;