19. 不安全:unsafe
使用 unsafe 关键字将 Rust 安全代码和非安全代码建立边界。 unsafe block unsafe {} 用于指示编译器忽略一些严格的安全检查(但不忽略所有检查), 主要使用场景: 读写裸指针(在安全代码中可以创建、转移、比较 裸指针,但是不能使用裸指针,如解引用和赋值); 调用外部库函
18. 测试:testing
Rust 提供了如下测试类型: 单元测试:Unit testing; 文档测试:Doc testing; 集成测试:Integration testing; Cargo.toml 为 testing/exampels 提供了单独的依赖配置: [dev-dependencies] pretty_ass
17. 外部函数调用:FFI
Rust 可以使用和链接其它语言开发的外部库中的函数和全局 item(如常量、变量、类型定义等),但在使用前必须在 extern block( extern "ABI" {}) 中声明。 extern block 中只能声明 static 变量(对应 C 的全局变量或常量)和函数(只是函数签名),后
16. 裸指针:raw pointer
Rust 提供两种类型的裸指针类型:*mut T 和 *const T。 裸指针的主要使用场景是 FFI,如 Rust 调用的 C 函数包含指针类型参数时需要使用裸指针: // libc 的 malloc 和 free 使用裸指针来管理内存 #[allow(unused_extern_crates)
15. 宏:macro
macro 可以简化重复代码编写任务,实现 DSL,编译时生成代码等: 快速创建 Vec 的 vec![] ; 为数据结构添加各种 trait 支持的 derive macro: #[derive(Debug, Default, ...)] ; 单元测试宏:#[cfg(test)] macro 还可
14. 异步:async
线程(thread)的问题: 每个线程都有固定大小的栈内存占用,成千上万个线程会消耗大量的内存; 内核调度线程运行的上下文切换开销大; 线程在执行 read/write 系统调用时,尤其是网络通信时,会有大量的时间被 block 等待,此时该线程不能再执行其它事情,效率低; 异步(async)通过创
13. 包和模块:package/crate/module
crate 一个 package 包含一个或多个 crate, crate 分 3 种类型: binary、library、procedure_macro。 使用 cargo new my-project 命令创建 package,一个 package 至多包含一个 library crate(使用
12. 迭代器:iterator
迭代器是实现 Iterator trait 的类型对象: pub trait Iterator { type Item; // Required method fn next(&mut self) -> Option<Self::Item>; // Provide
11. 类型协变:type coercion
子类型和变体 子类型(Subtyping)是隐式的自动转换 type coercion 支持的一个场景, 只用于表达 lifetime 之间的关系(Rust 类型之间 没有子类型语义),包含两种类型: 生命周期更长的 lifetime 是更短的子类型: 'b: 'a 表示 ‘b 的生命周期比 ‘a
10. 泛型和特性:generic/trait
泛型 类型/函数/方法可以使用泛型参数 <CamelCase, ...>,泛型参数可以使用 lifetime 和 trait 进行限界: // 泛型参数类型:T 为泛型类型名称,名称位于类型名后的 <..> 中。 // T 没有任何限界,默认为 Sized。 struct Point<T> { x: