Introduction¶
Rust简介
Rust有如下二进制文件
rustc:Rust编译器cargo:Rust包管理器和构建工具rustup:Rust版本管理器rustdoc:Rust文档rls:Rust language serverrustfmt:Rust代码格式化工具
Hello, world!¶
1 2 3 | |
println!中的!表示这是一个宏,而不是一个函数。宏是一种在编译时执行的代码。println有Python中str.format类似的功能,可以执行字符串格式化。print!与println!类似,但是不会在结尾添加换行符。
println!("{} days", 31);
println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");
println!("{greeting}, {name}!", greeting="Hello", name="world");
Cargo¶
Cargo是Rust的包管理器和构建工具。Cargo的工作方式与Python的pip和setuptools类似。
cargo new # 创建一个新的Rust项目
cargo init # (在已经存在的目录中)创建一个新的Rust项目
cargo build # 编译项目
cargo run # 编译并运行项目
cargo update # 更新Cargo.lock文件中的依赖
cargo doc # 生成项目文档
cargo test # 运行项目测试
cargo install ...
cargo uninstall ...
Rust的仓库是crates.io,类似于Python的PyPI。
包与模块¶
Rust中的包称为crate。crate的根目录下有一个Cargo.toml文件,其中包含crate的元数据和依赖。Rust项目的文件结构如下:
project
├── Cargo.toml
├── Cargo.lock
├── tests
│ └── ...
├── benches
│ └── ...
├── examples
│ └── ...
└── src
├── bin // 其他的二进制程序
├── main.rs // 默认的二进制程序
└── lib.rs // 库包(只能有一个)
Rust中的模块用mod关键字声明,模块可以嵌套。用use引用模块,可以用crate开始的绝对引用路径和self(本模块)或super(父模块)开始的相对引用路径,或者用*引入模块的所有内容。默认情况下,模块中的所有项都是私有的,不能被外界访问,除非用pub关键字声明为公有。公有模块内所有的项必须都用pub声明为公有。pub还可以用(in <module path>)语法声明对象仅在<module path>中可见。
每个.rs文件都可以被视为一个以文件名命名的模块。如果要把文件夹作为模块,则必须在文件夹中创建一个mod.rs文件或与文件夹同名的.rs文件,其中声明对外开放的项。
当多个模块中存在相同名称的项时,需要用模块名::项名来指定具体的项,或者用as声明别名。
注释与文档¶
Rust中的注释与C/C++类似,用//表示单行注释,用/* */表示多行注释。其中,常用的注释方法为:
- 包注释
//! ...与/*! ... */:()用于整个包的注释(Inner comments) - 文档注释
/// ...与/** ... */:用于模块、函数、结构体、枚举、方法和trait的注释(Outer comments) - 通常不用
/* */注释
也可以用doc attribute来注释,其语法为#![doc=...]和#[doc=...],分别对应Outer comments和Inner comments。
Rust支持在文档中进行测试,被测试的函数必须是公有的。以#开始的行表示该行不会在文档中显示,只会用于测试。
// Assume the name of crate is `playground`
/// ```rust
/// assert_eq!(playground::add(1, 2), 3);
/// ```
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
/// ```rust, should_panic
/// // This function calls [`panic!`] macro.
/// playground::panic_fn();
/// ```
pub fn panic_fn() {
panic!();
}