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!();
}