本系列是学习 Rust 的学习笔记,本编主要对 https://cheats.rs/ 的语法速查表进行翻译学习
定义代码单元及其抽象。
示例 | 说明 |
---|---|
trait T {} | 定义一个特性; 通常用于其他类型可以实现的通用行为。 |
trait T : R {} | T 是超特性R 的子特性。任何S 在实现T 之前必须先实现R 。 |
impl S {} | 为类型S 实现的实现功能,例如方法。 |
impl T for S {} | 为类型S 实现特性T 。 |
impl !T for S {} | 禁用自动派生的自动特性。 |
fn f() {} | 定义一个函数; 或者如果在impl 内部则是关联函数。 |
~~~~
fn f() -> S {} | 相同,返回类型为S的值。 |
~~~~
fn f(&self) {} | 定义一个方法,例如,在impl S {} 内。 |
const fn f() {} | 在编译时可用的常量fn ,例如,const X: u32 = f(Y) 。 |
async fn f() {} | 异步函数转换,使f 返回一个impl Future 。 |
~~~~
async fn f() -> S {} | 相同,但使f 返回一个impl Future<Output=S> 。 |
~~~~
async { x } | 在函数内部使用,使{ x } 成为一个impl Future<Output=X> 。 |
fn() -> S | 函数指针,持有可调用的地址的内存。 |
Fn() -> S | 可调用特性(也有FnMut 、FnOnce ),由闭包、fn等实现。 |
| | {} | 一个闭包,借用其捕获(例如,一个局部变量)。 |
~~~~
|x| {} | 接受一个名为x 的参数的闭包,主体是块表达式。 |
~~~~
|x| x + x | 相同,没有块表达式; 只能由单个表达式组成。 |
move |x| x + y | 拥有其捕获的闭包;即,y 转移到闭包中。 |
return | true | 有时闭包看起来像逻辑或(这里: 返回一个闭包)。 |
unsafe | 如果你喜欢在周五晚上调试段错误; 不安全的代码。 |
~~~~
unsafe fn f() {} | 意味着“调用可能会导致UB,你必须检查要求”。 |
~~~~
unsafe trait T {} | 意味着“T的粗心实现可能导致UB;实现者必须检查”。 |
~~~~
unsafe { f(); } | 向编译器保证“我已经检查过要求,相信我”。 |
~~~~
unsafe impl T for S {} | 保证 S 在T 方面行为良好;人们可以安全地在S 上使用T 。 |
函数 & 行为 的简单示例:
-
特性(Traits)
- 特性是 Rust 中用于定义共享行为的一种机制。
- 示例:定义一个特性
Drawable
,表示可绘制的对象,其中包含一个方法draw
。
trait Drawable { fn draw(&self); }
-
超特性(Supertraits)
- 超特性是一个特性可以继承其他特性的方法。
- 示例:定义一个特性
Shape
,它继承了Drawable
,表示形状对象。
trait Shape: Drawable { // 其他方法定义 }
-
实现(Implementation)
- 实现是为类型提供特性的具体实现。
- 示例:为结构体
Circle
实现Drawable
特性。
struct Circle { // 结构体字段 } impl Drawable for Circle { fn draw(&self) { // 绘制圆形的具体实现 } }
-
特性实现(Trait Implementation)
- 特性实现是为类型提供特性的具体实现。
- 示例:为结构体
Rectangle
实现Shape
特性。
struct Rectangle { // 结构体字段 } impl Shape for Rectangle { // 实现 Shape 特性的方法 }
-
自动特性(Auto Traits)
- 自动特性是由编译器自动生成的一种特性。
- 示例:禁用自动实现
Send
和Sync
特性。
struct MyType; unsafe impl !Send for MyType {} unsafe impl !Sync for MyType {}
-
函数定义和使用
- 函数是用于执行特定任务的代码单元。
- 示例:定义一个函数
add
,用于求两个整数的和。
fn add(x: i32, y: i32) -> i32 { x + y }
-
异步函数
- 异步函数是一种特殊类型的函数,可以在执行期间挂起并在后续恢复执行。
- 示例:定义一个异步函数
fetch_data
,用于从远程服务器获取数据。
async fn fetch_data(url: &str) -> Result<String, Error> { // 异步请求数据并返回结果 }
-
闭包
- 闭包是一种可以捕获其环境并在稍后执行的匿名函数。
- 示例:定义一个闭包,用于计算两个数字的和。
let add_closure = |x, y| x + y; let result = add_closure(3, 5); println!("Result: {}", result); // 输出:8