1 mod和文件系统
mod client{ fn connect(){} }
<a name="804c1c1b"></a>
## 1.2 模块可嵌套
mod client { fn connect() { } }
mod network { fn connect() { }
mod server {
fn connect() {
}
}
}
<a name="TLzOp"></a>
## 1.3 模块的文件系统规则
- 对于模块foo,在lib.rs中用mod foo;声明模块
- 若模块foo没有子模块,则在foo.rs中写模块代码
- 若模块foo有子模块,则创建目录foo,在foo/mod.rs中写模块代码,声明子模块;
- 总之,在lib.rs/mod.rs中声明顶级模块/非顶级模块;在 模块名(顶级模块)/mod(非顶级模块).rs文件中写模块代码,声明其子模块;目录层级代表模块层级。
<a name="kGAid"></a>
# 2 使用pub控制可见性
- 项目(模块/函数)默认是私有的,使用pub修饰使之变成公有的,可从外部访问
- 如果一个项是公有的,它能被任何父模块访问
- 如果一个项是私有的,它只能被当前模块或其子模块访问
<a name="nNio4"></a>
# 3 使用use导入命名
<a name="YDe7Q"></a>
## 3.1 使用函数全名调用,写法复杂
pub mod a { pub mod series { pub mod of { pub fn nested_modules() {} } } }
fn main() { a::series::of::nested_modules(); }
<a name="M37Wf"></a>
## 3.2 使用use导入名称,写法简单
use a::series::of;
fn main() { of::nested_modules(); }
<a name="ycCor"></a>
## 3.3 use可以导入函数
use a::series::of::nested_modules;
fn main() { nested_modules(); }
<a name="VfkL8"></a>
## 3.4 use可以导入枚举值
enum TrafficLight { Red, Yellow, Green, }
use TrafficLight::{Red, Yellow};
fn main() {
let red = Red;
let yellow = Yellow;
let green = TrafficLight::Green; // because we didn’t use
TrafficLight::Green
}
- use *进行全局导入
use TrafficLight::*;
fn main() { let red = Red; let yellow = Yellow; let green = Green; }
- 注意extern和use的差别:extern crate导入外部库(crate),只用于外部库;use相当于符号别名,可避免写(内部或者模块)函数、变量的全名,而只用写短名称。
<a name="8Fhse"></a>
# 4 源代码
extern crate chap07;
pub mod a { pub mod series { pub mod of {
#[derive(Debug)]
pub enum TrafficLight {
Red,
Yellow,
Green,
}
#[derive(Debug)]
pub enum Boolean{
True,
False,
}
pub fn nested_modules() {
println!("nested_modules");
}
}
}
}
// 可以直接导入函数 use a::series::of::nested_modules; // 可以导入枚举类型和枚举值 use a::series::of::TrafficLight; use a::series::of::TrafficLight::{Yellow,Green}; // 可以用进行全局导入 use a::series::of::Boolean::;
use chap07::network::*;
fn main(){
chap07::client::connect();
connect();
a::series::of::nested_modules();
nested_modules();
println!("red: {:?} yellow: {:?} green: {:?}",TrafficLight::Red,Yellow,Green);
println!("true({:?}) or false({:?})",True,False);
} ```