Mutable indexing Index允许只读访问。它不允许我们更改检索到的值。 IndexMut 如果我们想要支持可变性,那我们就需要实现IndexMut trait。 // Slightly simplified // 略微简化 pub trait
Indexing 上一节的练习中,Ticket::store根据给定的TicketId返回Option<&Ticket>。 我们之前已经学过了如何使用Rust的索引语法访问数组和vector的元素。 let v = vec![0, 1, 2]; assert_eq!
Ticket ID 让我们再想想我们的票务管理系统。 我们现在的Ticket模型如下: pub struct Ticket { pub title: TicketTitle, pub description: TicketDescription, pub sta
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的迭代器。 这也是它的缺点: