作者:CN059

59、Mutable slices(可变切片)

59、Mutable slices(可变切片)

Mutable slices(可变切片)   每当我们谈论切片类型(如str和[T])时,我们使用的都是他们的不可变借用形式(&str和&[T])。 但是切片也可以是可变的。   这是关于如何创建可变切片的例子: let mut numbers = vec![1,

CN059 CN059 2025-09-25
41 0 0
58、Slices(切片)

58、Slices(切片)

Slices(切片)   让我们回顾一下Vec的内存布局: let mut numbers = Vec::with_capacity(3); numbers.push(1); numbers.push(2);   我们之前学到了String本质上其实就是Vec<u8&g

CN059 CN059 2025-09-25
37 0 0
57、impl Trait第二节

57、impl Trait第二节

在参数位置的impl Trait   在前面的练习中,我们看到了如何使用impl Trait在不指定类型名的情况下返回类型。 相同的语法其实也可以用在参数的位置: fn print_iter(iter: impl Iterator<Item = i32>) { for

CN059 CN059 2025-09-25
35 0 0
56、impl Trait

56、impl Trait

impl Trait   上一节的Ticket::to_dos方法返回Vec<&ticket>。 每次调用该函数签名的时候,该签名都会引入新的堆内存分配,这可能是不必要的,这取决于调用者需要对结果做什么。如果返回迭代器而不是Vec,to_dos会更好,从而使调用者能够决

CN059 CN059 2025-09-25
33 0 0
55、组合器

55、组合器

Combinators(组合器)   迭代器可以做的不仅仅是for循环。 如果我们查看Iteratortrait的文档,我们可以发现大量方法可以用来以各种方式转换、过滤和组合迭代器。   这里我们可以先了解一下最常见的一些组合器: map可以将函数应用于迭代器的每个元素。 fi

CN059 CN059 2025-09-25
30 0 0
54、生命周期

54、生命周期

Lifetimes(生命周期)   让我们尝试通过为&TicketStore添加一个IntoIterator的实现来完成前面的练习,以最大程度地方便使用for循环。   让我们从填写实现中最“明显”的部分开始: impl IntoIterator for &Tic

CN059 CN059 2025-09-23
42 0 0
53、Iter

53、Iter

.iter()   IntoIterator消耗self来创建一个迭代器。   这有它的好处:我们可以从迭代器中获取拥有权的值。例如:如果我们在Vec<Ticket>上调用.into_iter(),我们将会后的返回Ticket的迭代器。   这也是它的缺点:

CN059 CN059 2025-09-23
39 0 0
52、Iterators(迭代器)

52、Iterators(迭代器)

Iteration(迭代)   在第一个练习中,我们学到Rust允许我们使用for循环遍历集合。当时我们关注的是范围(例如0..5),但是对于数组和vector等集合也是如此。 // It works for `Vec`s let v = vec![1, 2, 3]; for n in v

CN059 CN059 2025-09-20
40 0 0
51、Resizing(内存再分配)

51、Resizing(内存再分配)

Resizing   之前了解了,Vec是一种可以“生长”的vector类型,但这意味着什么?如果我们尝试将一个元素插入到已经达到最大容量的Vec时,会发生什么? let mut numbers = Vec::with_capacity(3); numbers.push(1); numbe

CN059 CN059 2025-09-20
50 0 0
50、动态数组(Vectors)

50、动态数组(Vectors)

Vectors   静态数组的优点也是他们的缺点:他们的大小必须在编译时预先知道。如果我们尝试创建一个大小仅在运行时已知的数组,我们将会收到编译错误: let n = 10; let numbers: [u32; n]; error[E0435]: attempt to use a no

CN059 CN059 2025-09-19
38 0 0
1 2 3 4 5 6 11