Iteration(迭代) 在第一个练习中,我们学到Rust允许我们使用for循环遍历集合。当时我们关注的是范围(例如0..5),但是对于数组和vector等集合也是如此。 // It works for `Vec`s let v = vec![1, 2, 3]; for n in v
Resizing 之前了解了,Vec是一种可以“生长”的vector类型,但这意味着什么?如果我们尝试将一个元素插入到已经达到最大容量的Vec时,会发生什么? let mut numbers = Vec::with_capacity(3); numbers.push(1); numbe
Vectors 静态数组的优点也是他们的缺点:他们的大小必须在编译时预先知道。如果我们尝试创建一个大小仅在运行时已知的数组,我们将会收到编译错误: let n = 10; let numbers: [u32; n]; error[E0435]: attempt to use a no
一旦我们想要做“票务管理”,我们就需要考虑一种存储多张tickets的方法。反过来,这意味着我们需要考虑集合的问题,特别是同质集合:我们希望存储多个相同类型的实例。 在这方面,Rust能提供什么呢? Arrays 首先可以尝试使用数组,Rust中的数组是相同类型元素的固定大小的集合。
Ticket管理系统——引言 在前一章中,我们孤立地建模了 Ticket:定义了它的字段及其约束,学习了如何在 Rust 中最好地表示这些字段,但并未考虑 Ticket 如何融入更大的系统。本章我们将围绕 Ticket 构建一个简单的流程,引入一个(基础的)管理系统来存储和获取tick
总结 谈到domain modelling(领域建模)时,细节决定成败。 Rust 提供了丰富的工具,可以帮助我们将领域中的约束直接表达在类型系统中,但要想掌握并写出符合惯例的代码,仍需一些实践和经验积累。 让我们以对Ticket模型的最后改进来结束本章。 我们将为Ticket中的每个
Error::source 为了完成对Error trait的学习,我们还需要学习一个东西:source方法。 // Full definition this time! pub trait Error: Debug + Display { fn source(&sel
TryFrom和TryInto 上一个章节我们学到了From trait和Into trait,这是Rust的用于无误类型转换的惯用接口。 但是,如果不能保证转换一定成功该怎么办呢? 现在我们对错误有了足够的了解,可以讨论From和Into能够进行错误处理的版本:TryF
thiserror 前面讲的那几节专门为了thiserror铺垫显得有点绕道,不是吗?但这是必要的! 让我们重回正轨:自定义错误类型和thiserror。 自定义错误类型 之前已经学过了如何为自定义错误类型“手动”实现Error trait。 试想一下,我们
Dependencies(依赖) 一个Package可以依赖其他Package,通过把那些被依赖的Package放在Cargo.toml文件下的[dependencies]部分。 指定依赖项的最常见的方式是提供其名称和版本: [dependencies] thiserro