字符串

&str 是一个动态大小类型 (DST).

函数形参如果是 &str 类型,&String 类型的实参可以被隐式转换成 &str 类型.

但是如果形参是 &str 类的禀赋 (trait), 则 &String 类型无法被隐式转换, 必须使用 &*实参显式转换成 &str

&str 只读,拥有一些方法,但是返回的都是自己或者是全新 String 对象.

常用宏

write!(格式化器: fmt::Formatter, 模板字符串, ...): 向 格式化器 写入某个字符串。常用于实现 Display 禀赋.

dbg!(表达式): 打印出 表达式 的调试信息. 同时拿走 表达式 的所有权。但是会通过返回值返还所有权.

panic(恐慌信息): 使程序恐慌并输出恐慌信息.

format!(模板字符串, ...)

matches!(表达式, 模式)

thread_local!(变量定义)

include!(文件路径字符串)

concat!()

env!()

T:'static

As a trait bound, it means the type does not contain any non-static references. Eg. the receiver can hold on to the type for as long as they want and it will never become invalid until they drop it.

It's important to understand this means that any owned data always passes a 'static lifetime bound, but a reference to that owned data generally does not.

cxx

如果需要跟 C++ 代码交互,非常推荐使用 cxx,它提供了双向的调用,最大的优点就是安全:是的,你无需通过 unsafe 来使用它!

Miri

miri 可以生成 Rust 的中间层表示 MIR,对于编译器来说,我们的 Rust 代码首先会被编译为 MIR ,然后再提交给 LLVM 进行处理。

可以通过 rustup component add miri 来安装它,并通过 cargo miri 来使用,同时还可以使用 cargo miri test 来运行测试代码。

miri 可以帮助我们检查常见的未定义行为 (UB = Undefined Behavior),以下列出了一部分:

内存越界检查和内存释放后再使用 (use-after-free) 使用未初始化的数据 数据竞争 内存对齐问题 但是需要注意的是,它只能帮助识别被执行代码路径的风险,那些未被执行到的代码是没办法被识别的。

rust-bindgen 和 cbindgen

对于 FFI 调用来说,保证接口的正确性是非常重要的,这两个库可以帮我们自动生成相应的接口,其中 rust-bindgen 用于在 Rust 中访问 C 代码,而 cbindgen 则反之。

Prusti

prusti 需要大家自己来构建一个证明,然后通过它证明代码中的不变量是正确被使用的,当你在安全代码中使用不安全的不变量时,就会非常有用。具体的使用文档见这里。

模糊测试 (fuzz testing)

在 Rust Fuzz Book 中列出了一些 Rust 可以使用的模糊测试方法。

同时,我们还可以使用 rutenspitz 这个过程宏来测试有状态的代码,例如数据结构。

Tokio

我们提到了 Rust 异步编程的限制,其中之一就是你必须引入社区提供的异步运行时,其中最有名的就是 tokio。

anyhow 和 thiserror

如果你想要设计自己的错误类型,同时给调用者提供具体的信息时,就使用 thiserror,例如当你在开发一个三方库代码时。如果你只想要简单,就使用 anyhow,例如在自己的应用服务中。

syn 和 quote

其中 syn 和 quote 依赖包都是定义过程宏所必需的,同时,还需要在 [lib] 中将过程宏的开关开启 : proc-macro = true。

criterion

基准测试包.