欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
全部教程·
Rust语言·
通过例子学Rust
[目录]
·
3.2.3 测试实例:链表
Rust 简介
1. Hello World
1.1. 注释
1.2. 格式化输出
1.2.1 调试(debug)
1.2.2 显示(display)
1.2.3 测试实例:List
1.2.4 格式化
2. 原生类型
2.1. 字面量和运算符
2.2. 元组
2.3. 数组和切片
3. 自定义类型
3.1. 结构体
3.2. 枚举
3.2.1 使用 use
3.2.2 C 风格用法
3.2.3 测试实例:链表
3.3. 常量
4. 变量绑定
4.1. 可变变量
4.2. 作用域和遮蔽
4.3. 变量先声明
4.4. 冻结
5. 类型系统
5.1. 类型转换
5.2. 字面量
5.3. 类型推断
5.4. 别名
6. 类型转换
6.1. From 和 Into
6.2. TryFrom 和 TryInto
6.3. ToString 和 FromStr
7. 表达式
8. 流程控制
8.1. 条件语句 if/else
8.2. 循环语句 loop
8.2.1. 嵌套循环和标签
8.2.2 loop 循环返回
8.3. while 循环
8.4. for 循环
8.5. match 匹配
8.5.1 match 解构元组
8.5.2 match 解构枚举
8.5.3 match 解构指针
8.5.4 match 解构结构体
8.5.5 卫语句
8.5.6 绑定
8.5.7 if let 语句
8.5.8 while let 语句
9. Rust 函数
9.1 Rust 方法
9.2 Rust 闭包
9.2.1 捕获变量
9.2.2 作为输入参数
9.2.3 类型匿名
9.2.4 输入函数
9.2.5 作为输出参数
9.2.6 Iterator::any
9.2.7 Iterator::find
9.3. 高阶函数
9.4. 发散函数
10. 模块
10.1. 可见性
10.2. 结构体的可见性
10.3. use 声明
10.4. super 和 self
10.5. 文件分层
11. crate
11.1. 库
11.2. 使用库
12. cargo
12.1. 依赖
12.2. 约定规范
12.3. 测试
12.4. 构建脚本
13. 属性
13.1 死代码
13.2 crate
13.3 cfg
13.4 自定义条件
14. 泛型
14.1. 函数
14.2. 实现
14.3. trait
14.4. 约束
14.4.1 空约束
14.5. 多重约束
14.6. where 子句
14.7. newtype 惯用法
14.8. 关联项
14.8.1 存在问题
14.9. 虚类型参数
14.9.1 单位检查
Rust 简介
1. Hello World
1.1. 注释
1.2. 格式化输出
1.2.1 调试(debug)
1.2.2 显示(display)
1.2.3 测试实例:List
1.2.4 格式化
2. 原生类型
2.1. 字面量和运算符
2.2. 元组
2.3. 数组和切片
3. 自定义类型
3.1. 结构体
3.2. 枚举
3.2.1 使用 use
3.2.2 C 风格用法
3.2.3 测试实例:链表
3.3. 常量
4. 变量绑定
4.1. 可变变量
4.2. 作用域和遮蔽
4.3. 变量先声明
4.4. 冻结
5. 类型系统
5.1. 类型转换
5.2. 字面量
5.3. 类型推断
5.4. 别名
6. 类型转换
6.1. From 和 Into
6.2. TryFrom 和 TryInto
6.3. ToString 和 FromStr
7. 表达式
8. 流程控制
8.1. 条件语句 if/else
8.2. 循环语句 loop
8.2.1. 嵌套循环和标签
8.2.2 loop 循环返回
8.3. while 循环
8.4. for 循环
8.5. match 匹配
8.5.1 match 解构元组
8.5.2 match 解构枚举
8.5.3 match 解构指针
8.5.4 match 解构结构体
8.5.5 卫语句
8.5.6 绑定
8.5.7 if let 语句
8.5.8 while let 语句
9. Rust 函数
9.1 Rust 方法
9.2 Rust 闭包
9.2.1 捕获变量
9.2.2 作为输入参数
9.2.3 类型匿名
9.2.4 输入函数
9.2.5 作为输出参数
9.2.6 Iterator::any
9.2.7 Iterator::find
9.3. 高阶函数
9.4. 发散函数
10. 模块
10.1. 可见性
10.2. 结构体的可见性
10.3. use 声明
10.4. super 和 self
10.5. 文件分层
11. crate
11.1. 库
11.2. 使用库
12. cargo
12.1. 依赖
12.2. 约定规范
12.3. 测试
12.4. 构建脚本
13. 属性
13.1 死代码
13.2 crate
13.3 cfg
13.4 自定义条件
14. 泛型
14.1. 函数
14.2. 实现
14.3. trait
14.4. 约束
14.4.1 空约束
14.5. 多重约束
14.6. where 子句
14.7. newtype 惯用法
14.8. 关联项
14.8.1 存在问题
14.9. 虚类型参数
14.9.1 单位检查
Rust 测试实例:链表
enum 的一个常见用法就是创建链表(linked-list):
use List::*;
enum List {
// Cons:元组结构体,包含链表的一个元素和一个指向下一节点的指针
Cons(u32, Box),
// Nil:末结点,表明链表结束
Nil,
}
// 可以为 enum 定义方法
impl List {
// 创建一个空的 List 实例
fn new() -> List {
// `Nil` 为 `List` 类型(译注:因 `Nil` 的完整名称是 `List::Nil`)
Nil
}
// 处理一个 List,在其头部插入新元素,并返回该 List
fn prepend(self, elem: u32) -> List {
// `Cons` 同样为 List 类型
Cons(elem, Box::new(self))
}
// 返回 List 的长度
fn len(&self) -> u32 {
// 必须对 `self` 进行匹配(match),因为这个方法的行为取决于 `self` 的
// 取值种类。
// `self` 为 `&List` 类型,`*self` 为 `List` 类型,匹配一个具体的 `T`
// 类型要好过匹配引用 `&T`。
match *self {
// 不能得到 tail 的所有权,因为 `self` 是借用的;
// 因此使用一个对 tail 的引用
Cons(_, ref tail) => 1 + tail.len(),
// (递归的)基准情形(base case):一个长度为 0 的空列表
Nil => 0
}
}
// 返回列表的字符串表示(该字符串是堆分配的)
fn stringify(&self) -> String {
match *self {
Cons(head, ref tail) => {
// `format!` 和 `print!` 类似,但返回的是一个堆分配的字符串,
// 而不是打印结果到控制台上
format!("{}, {}", head, tail.stringify())
},
Nil => {
format!("Nil")
},
}
}
}
fn main() {
// 创建一个空链表
let mut list = List::new();
// 追加一些元素
list = list.prepend(1);
list = list.prepend(2);
list = list.prepend(3);
// 显示链表的最后状态
println!("linked list has length: {}", list.len());
println!("{}", list.stringify());
}
下一章:Rust 常量
Rust 有两种常量,可以在任意作用域声明,包括全局作用域。它们都需要显式的类型声明:const:不可改变的值(通常使用这种)。static:具有 'static 生命周期的,可以是可变的变量(译注:须使用static mu ...
AI 中文社