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);
} ```
