跳转至

Introduction

Rust简介

Rust有如下二进制文件

  • rustc:Rust编译器
  • cargo:Rust包管理器和构建工具
  • rustup:Rust版本管理器
  • rustdoc:Rust文档
  • rls:Rust language server
  • rustfmt:Rust代码格式化工具

Hello, world!

Download source code

1
2
3
fn main() {
    println!("Hello, world!");
}

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的pipsetuptools类似。

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++类似,用//表示单行注释,用/* */表示多行注释。其中,常用的注释方法为:

  1. 包注释//! .../*! ... */:()用于整个包的注释(Inner comments)
  2. 文档注释/// .../** ... */:用于模块、函数、结构体、枚举、方法和trait的注释(Outer comments)
  3. 通常不用/* */注释

也可以用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!();
}

评论