RUST
Rust 程序设计语言 - Rust 程序设计语言 简体中文版 (kaisery.github.io)
Packages
Cargo的一个功能,可以构建、测试和分享crate。包是提供一系列功能的一个或多个crate。一个包会包含一个Cargo.toml文件。Cargo本身也是一个包含构建代码的二进制项目的包。包中可以包含至多一个库crate,和任意多个二进制crate,但是必须至少有一个crate。
一个包目录中
src/main.rs
是与包名相同的二进制crate的根cratesrc/lib.rs
是与包名相同的库crate的根cratesrc/bin
目录下是这个包中的其他的二进制crate
crate根文件由Cargo传递给rustc来实际构建库或二进制项目。
Crates
crate是rust在编译时的最小代码单位,可以是一个文件。Crate有两类:库或二进制项目。一般crate都是指的库。
Modules
多个模块构成了一个crate,用来对一个crate中的代码进行分组,提高可读性和重复使用。模块使用mod声明,和python的module类似,也可以看作和c++中的namespace类似。
模块以树结构进行组织,一个模块中的代码默认是私有的,子模块可以访问父模块的成员,但父模块默认不能访问子模块的成员,除非在子模块中将成员声明为pub的。同一级的模块之间是可以访问的。
使用super可以访问父一级的内容(方法,结构体,枚举等)。
如果一个模块声明了pub,他的内容对外部来说,还是私有不能访问的,要访问一个模块的内容,必须给具体的内容,例如函数,结构体加上pub。
结构体内的字段默认都是私有,而枚举中的字段都是公开的,不需要给枚举的每个值都增加pub。
src/lib.rs
文件中
1 | fn deliver_order() {} |
use
可以使用use简化模块使用时很长的前缀,和c++的using或python的import类似的作用。use的短路径只能在use所在的特定作用域内使用,如果和use的作用域不同,就不能使用。
1 | use crate::front_of_house::hosting; |
use其实也可以直接指定到最后的接口,但是那样以来,使用的地方直接调用接口名字,可能存在不同模块内用相同接口名的情况。所以,一般只是把use指定到模块,类,结构体或枚举。类似python的import,use也有as的语法别名,这样也可以避免冲突。
1 | use std::fmt::Result; |
使用pub use
可以把一个名称重导出,相同于这个名字就定义在当前作用域一样。
1 | pub use crate::front_of_house::hosting; |
use语句可以把多个语句合并简化
1 | use std::{cmp::Ordering, mem}; |
模块文件管理
不同的模块可以按文件放在其父模块的目录中,编译器根据mod语句定位模块的代码文件的位置。
例如crate的根文件src/lib.rs
中
1 | mod front_of_house; // 声明front_of_house模块 |
编译器看到了根文件中的front_of_house模块声明,就会在根目录中找这个src/front_of_house.rs
文件。在src/front_of_house.rs
中,
1 | pub mod hosting; |
hosting
是front_of_house
的子模块,所以它的模块文件放在他父模块front_of_house
同名的目录下src/front_of_house/hosting.rs
1 | pub fn add_to_waitlist() {} |
IO控制台项目
- 将程序拆成main.rs和lib.rs,程序的逻辑放入lib.rs中
- main中调用lib的run函数
main.rs中
1 | use std::env; |
lib.rs中
1 | use std::error::Error; |
cargo test执行其中的单元测试用例
windows中设置环境变量,并运行程序
PS E:\code\rust\minigrep> $Env:IGNORE_CASE=1; cargo run Body poem.txt
- 使用
eprintln!
将错误信息输出到标准错误流,将正常输出到文件中。
cargo run BOdy poem.txt > output.txt