Mutable slices(可变切片) 每当我们谈论切片类型(如str和[T])时,我们使用的都是他们的不可变借用形式(&str和&[T])。 但是切片也可以是可变的。 这是关于如何创建可变切片的例子: let mut numbers = vec![1,
Slices(切片) 让我们回顾一下Vec的内存布局: let mut numbers = Vec::with_capacity(3); numbers.push(1); numbers.push(2); 我们之前学到了String本质上其实就是Vec<u8&g
在参数位置的impl Trait 在前面的练习中,我们看到了如何使用impl Trait在不指定类型名的情况下返回类型。 相同的语法其实也可以用在参数的位置: fn print_iter(iter: impl Iterator<Item = i32>) { for
impl Trait 上一节的Ticket::to_dos方法返回Vec<&ticket>。 每次调用该函数签名的时候,该签名都会引入新的堆内存分配,这可能是不必要的,这取决于调用者需要对结果做什么。如果返回迭代器而不是Vec,to_dos会更好,从而使调用者能够决
Combinators(组合器) 迭代器可以做的不仅仅是for循环。 如果我们查看Iteratortrait的文档,我们可以发现大量方法可以用来以各种方式转换、过滤和组合迭代器。 这里我们可以先了解一下最常见的一些组合器: map可以将函数应用于迭代器的每个元素。 fi
Lifetimes(生命周期) 让我们尝试通过为&TicketStore添加一个IntoIterator的实现来完成前面的练习,以最大程度地方便使用for循环。 让我们从填写实现中最“明显”的部分开始: impl IntoIterator for &Tic
.iter() IntoIterator消耗self来创建一个迭代器。 这有它的好处:我们可以从迭代器中获取拥有权的值。例如:如果我们在Vec<Ticket>上调用.into_iter(),我们将会后的返回Ticket的迭代器。 这也是它的缺点:
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