132 lines
6.1 KiB
Rust
Executable File
132 lines
6.1 KiB
Rust
Executable File
/*
|
||
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; |