听GPT 讲Rust源代码--library/core/src(2)

2023-11-14 19:11:40 浏览数 (2)

题图来自 5 Ways Rust Programming Language Is Used[1]

File: rust/library/core/src/iter/adapters/by_ref_sized.rs

在Rust的源代码中,rust/library/core/src/iter/adapters/by_ref_sized.rs 文件实现了 ByRefSized 适配器,该适配器用于创建一个可以以引用的方式访问可迭代对象的迭代器。通过这个适配器,可以在不转移可迭代对象的所有权的情况下对其进行迭代和使用。

该文件中定义的几个 struct 分别是 ByRefSizedEnumerateFilterSkip

  1. ByRefSized<'a, I: 'a>:这是 ByRefSized 的主要结构体,包含了一个可迭代对象 iter 和一个生命周期 'a,用于指定引用的有效期。它实现了一些对可迭代对象的引用迭代方法,如 next, size_hint, count 等。
  2. Enumerate<I>:这是一个用于将可迭代对象的元素和其索引一起返回的适配器。它包含了一个 ByRefSized 类型的 iter 和一个计数器 count,用于追踪当前元素的索引。通过 Enumerate 适配器,可以在迭代过程中同时获得元素和对应的索引。
  3. Filter<I, P>:这是一个用于根据特定条件过滤可迭代对象的适配器。它包含了一个 ByRefSized 类型的 iter 和一个谓词 P,用于确定哪些元素符合条件。通过 Filter 适配器,可以对可迭代对象进行筛选,只保留满足条件的元素。
  4. Skip<I>:这是一个用于跳过可迭代对象前 n 个元素的适配器。它包含了一个 ByRefSized 类型的 iter 和一个计数器 n,用于记录已经跳过的元素数量。通过 Skip 适配器,可以在迭代过程中跳过指定数量的元素。

总体而言,rust/library/core/src/iter/adapters/by_ref_sized.rs 文件中的这些结构体为可迭代对象提供了一些常用的适配器操作,例如引用迭代、索引元素和过滤元素等。它们可以方便地组合使用,使得对可迭代对象的操作更加灵活和高效。

File: rust/library/core/src/iter/adapters/map.rs

rust/library/core/src/iter/adapters/map.rs文件是Rust中的一个适配器(adapter),用于对迭代器进行映射操作。

该文件主要定义了一个名为Map的结构体和相关的trait实现,用以生成一个新的迭代器,通过对原始迭代器的元素进行映射操作来产生新的元素。

在map.rs文件中,Map结构体作为一个迭代器适配器,实现了Iterator trait,在迭代过程中将迭代器的元素进行映射操作,并生成新的元素。

Map结构体的定义如下:

代码语言:javascript复制
pub struct Map<I, F> { ... }

其中,I表示原始迭代器的类型,F表示映射操作的闭包(或者函数指针)。Map结构体具有以下重要的方法和特征:

  • fn new(iter: I, f: F) -> Map<I, F>:构造函数,用于创建一个Map结构体的实例。
  • fn iter(&mut self) -> &mut I:返回可变借用的原始迭代器,可以通过该方法修改迭代器的状态。
  • fn into_inner(self) -> I:将Map结构体消耗并返回原始迭代器,这在需要获取原始迭代器的所有权时非常有用。
  • impl<I, F, B> Iterator for Map<I, F> where I: Iterator, F: FnMut(I::Item) -> B:实现Iterator trait,使得Map结构体可以被直接用于for循环或其他支持迭代器的方法。

此外,在map.rs文件中还定义了一些辅助结构体和trait实现,用于支持映射操作的处理流程。这些结构体和trait的作用包括:

  • MapOp:表示映射操作。它具有一个名为call的方法,用于执行映射操作。
  • MapCollect:表示映射操作的消费(consume)版本。它具有一个名为call的方法,用于执行映射操作并返回新的集合。
  • MapWith:表示映射操作以及附加状态。它具有一个名为call的方法,用于执行映射操作,并获取和修改状态。
  • MapFuse:表示映射操作的延迟执行版本。它具有一个名为call的方法,用于执行映射操作并返回一个延迟执行的结果。

总结而言,rust/library/core/src/iter/adapters/map.rs文件定义了Map结构体和相关的trait实现,用于生成一个新的迭代器,通过对原始迭代器的元素进行映射操作来产生新的元素。这样可以在迭代过程中对元素进行更加灵活的处理,满足各种复杂的需求。

File: rust/library/core/src/iter/adapters/cloned.rs

在Rust的标准库中,cloned.rs文件定义了一系列适配器(adapters),用于克隆(clone)迭代器中的元素。迭代器是Rust中非常重要的一个概念,它用于遍历各种集合,像数组、矢量或哈希集等。克隆迭代器适配器允许消费原始迭代器并以克隆的方式生成一个新的迭代器。

具体来说,cloned.rs文件中主要定义了一个名为Cloned<I>的结构体,该结构体实现了迭代器(Iterator)特性,并封装了一个原始迭代器I。它的作用是克隆原始迭代器中的元素,并生成一个产生克隆副本的新迭代器。

在Rust中,某些类型(比如引用类型)不具备Copy特性,意味着它们在拷贝时会转移所有权。使用Cloned适配器可以避免转移所有权的问题,因为它会克隆每个元素而不是简单地拷贝。这在某些场景下非常有用,比如希望对原始集合进行遍历,但不想修改它们的值。

Cloned<I>结构体还包含了一些方法,用于实现迭代器特性中的相关函数。例如,next()方法用于获取下一个克隆的元素,size_hint()方法用于提供迭代器的大小估计等。这些方法允许对克隆迭代器进行遍历和操作。

总结起来,cloned.rs文件中的Cloned<I>结构体及其相关方法定义了一个适配器,用于生成一个产生克隆副本的新迭代器。这有助于在使用不具备Copy特性的类型时,对原始集合进行遍历和操作,而不会转移所有权。

File: rust/library/core/src/iter/adapters/rev.rs

在Rust源代码中,rev.rs文件位于rust/library/core/src/iter/adapters/目录下,它实现了反转迭代器的逻辑。

反转迭代器是一个适配器,它的作用是将原始迭代器中的元素按照相反的顺序进行迭代。在rev.rs文件中,定义了Rev<T>结构体,其中的T是原始迭代器的类型。

Rev<T>结构体实现了Iterator trait,因此可以调用迭代器相关的方法,例如nextnthfor_each等。它存储了一个原始迭代器对象,并提供了一个反转的迭代器。

Rev<T>结构体中,实现了迭代器的相关方法。这些方法与原始迭代器类似,但元素的顺序是相反的。例如,next方法返回下一个元素,但是从原始迭代器的末尾开始返回;nth方法返回第n个元素,但是从原始迭代器的末尾开始计数;for_each方法对每个元素执行给定的闭包函数,但是从原始迭代器的末尾开始执行。

此外,Rev<T>还提供了其他一些方法,用于操作反转迭代器。例如,size_hint方法返回反转迭代器的长度范围,rev方法返回一个新的反转迭代器,by_ref方法返回一个可变引用的迭代器等。

总的来说,Rev<T>结构体在Rust中实现了反转迭代器的逻辑,用于对原始迭代器进行反转迭代操作,提供了一系列的方法来处理元素的顺序。

File: rust/library/core/src/iter/adapters/step_by.rs

在Rust源代码中,step_by.rs文件是位于core库中的iter/adapters目录下的一个文件。它实现了迭代器适配器StepBy,该适配器可以按照指定的步长对一个迭代器进行分割。

在详细介绍之前,先了解一下几个关键概念:

  • 迭代器(Iterator):Rust中的一种抽象,用于表示一系列可以逐个访问的元素。
  • 适配器(Adapter):Rust中的迭代器的一种操作,可以对原始迭代器进行变换或者过滤等操作,返回一个新的迭代器。
  • 步长(Step):指定每次跳过多少个元素进行分割的参数。

StepBy适配器的作用是按照指定的步长对一个迭代器进行分割。这样做可以使得我们只获取每个分段的第一个元素。例如,如果我们有一个包含10个元素的迭代器,并且指定步长为3,那么StepBy适配器将把这个迭代器分成3个片段,分别是包含第0、3和6个元素的迭代器。

下面详细介绍一下StepBy<I>相关的几个结构体和trait:

  1. SpecRangeSetup<T>:这是一个用于构建StepBy适配器的辅助结构体。通过指定起始值(start)、结束值(end)和步长(step),它可以生成一个SpecRange<T>结构体。
  2. StepByImpl<I>:这是实现StepBy适配器的结构体。它包含一个iter字段,代表待分割的原始迭代器。StepByImpl<I>实现了Iterator trait,可以被迭代并返回每个分段的第一个元素。
    • new():该方法用于创建一个新的StepByImpl<I>结构体实例。它接收一个原始迭代器,并将其存储在iter字段中。
    • next():该方法用于获取下一个分段的第一个元素,并返回一个Option,用于表示是否还有元素可迭代。
  3. StepByBackImpl<I>:这是StepBy适配器的反向实现。它继承自StepByImpl结构体,并在next_back()方法中反向迭代并返回每个分段的第一个元素。

总而言之,step_by.rs文件中的结构体和trait实现了用于按照指定步长分割迭代器的适配器,并提供了正向和反向迭代的方式。这个适配器可以在处理大型数据集合时优化性能,只处理必要的分段数据而非全部数据。

File: rust/library/core/src/iter/adapters/zip.rs

在Rust的标准库中,"rust/library/core/src/iter/adapters/zip.rs" 文件的作用是实现了用于将两个迭代器进行压缩的适配器。

首先,让我们来了解一下在这个文件中定义的一些结构体和 trait。

  1. Zip<A, B> 结构体:这是压缩迭代器适配器的主要结构体,用于在两个迭代器上创建一个新的迭代器。它包含了两个迭代器 AB
  2. ZipImpl<A, B> 结构体:这是 Zip 结构体的实现。它定义了迭代器的功能,包括 nextsize_hint 等。它将两个迭代器的元素进行压缩,并在需要时返回元素对。
  3. ZipFmt<A, B> 结构体:这个结构体是用于格式化的传递器。它实现了 std::fmt::Debugstd::fmt::Display 和其他格式化相关的 trait。它可用于在调试时打印出压缩迭代器的内容。

接下来,让我们来了解几个与 ZipImpl<A, B> 相关的 trait:

  1. TrustedRandomAccess trait:此 trait 定义了支持拥有索引和随机访问的压缩迭代器的功能。实现了该 trait 的迭代器可以使用索引访问元素以及快速地获取迭代器长度。
  2. TrustedRandomAccessNoCoerce trait:这个 trait 是 TrustedRandomAccess 的一个变种,它的实现不会对 index 方法的返回类型进行强制类型转换。
  3. SpecTrustedRandomAccess trait:这个 trait 是 TrustedRandomAccess 的另一个变种。它为特定元素类型的压缩迭代器提供了额外的功能,以提高性能和效率。

通过使用 Zip 结构体以及相关的结构体和 trait,你可以在 Rust 中创建压缩迭代器。这些压缩迭代器可以同时遍历两个迭代器,并将它们的元素压缩在一起返回。这在需要同时处理多个相关联的数据源时非常有用。

File: rust/library/core/src/iter/adapters/skip_while.rs

在Rust的标准库中,rust/library/core/src/iter/adapters/skip_while.rs 文件定义了 SkipWhile 结构体,它是一个迭代器适配器,用于跳过满足某个条件的元素之前的所有元素,并返回剩下的元素。

SkipWhile 结构体有三个泛型参数:IPItem。其中,I 是要被跳过元素的迭代器类型,P 是一个闭包类型,用于判断哪些元素要被跳过,Item 是迭代器产生的元素类型。

结构体 SkipWhile 实现了 Iterator trait,因此,它可以被用作一个迭代器。它有以下主要方法:

  • fn new(iter: I, pred: P) -> SkipWhile<I, P>:创建一个新的 SkipWhile 迭代器,传入要被跳过元素的迭代器 iter 和判断条件的闭包函数 pred
  • fn next(&mut self) -> Option<Self::Item>:获取下一个元素,并返回一个 Option 类型的值,表示如果还有元素则返回 Some(item),否则返回 None
  • fn count(self) -> usize:返回剩下的元素的数量,该方法会迭代整个迭代器来计算数量。
  • fn nth(&mut self, n: usize) -> Option<Self::Item>:跳过迭代器中的指定数量 n 的元素,并返回下一个元素。

SkipWhile 结构体的核心功能在 Iterator trait 的实现中,它重写了 next 方法来实现跳过满足条件的元素。具体实现是通过调用介于迭代器和过滤器之间的 Skip 结构体的 find() 方法来找到第一个不再满足条件的元素,然后返回剩下的元素。同时,SkipWhile 结构体还实现了其他一些 Iterator trait 的方法,以方便对剩下的元素进行操作。

总之,SkipWhile 结构体是一个有用的迭代器适配器,可以帮助我们跳过满足某个条件的前缀元素,并返回剩下的元素。

File: rust/library/core/src/iter/adapters/take.rs

在Rust源代码中,rust/library/core/src/iter/adapters/take.rs文件包含了关于“take”适配器的实现。这个适配器可以在一个迭代器中至多获取指定数量的元素,然后停止迭代。

文件中的主要结构是Take<I>,它是一个带有类型参数I的结构体。Take<I>实现了迭代器接口(Iterator trait),以及其他相关的特性。它被用来包装其他迭代器I,然后根据需要从中取出元素。

Take<I>结构体有以下几个主要角色和作用:

  1. 将其他迭代器包装起来,以便在需要时控制元素的数量。
  2. 跟踪已经遍历过的元素数量,以便在达到指定数量后停止迭代。
  3. 当迭代器的元素数量不足指定数量时,只取出已有的元素,并使用预设的默认值填充剩余的位置。
  4. 提供可变借用方法,以便在迭代过程中改变指定数量的元素。

此外,文件中的SpecTake是一个特质(trait),定义了不同类型的Take适配器的行为。这个特质定义了一些方法,如count, try_fold, fold, all, any等。这些方法提供了不同的迭代行为,例如计数、遍历规约、折叠等。

总的来说,rust/library/core/src/iter/adapters/take.rs文件的作用是提供了一个“take”适配器,允许用户从一个迭代器中取出指定数量的元素。这个适配器可以为迭代器提供一些额外的功能,如计数、折叠等操作。

File: rust/library/core/src/iter/adapters/map_windows.rs

在Rust源代码中,rust/library/core/src/iter/adapters/map_windows.rs 这个文件的作用是实现了 Iterator trait 的 map_windows() 函数,该函数提供了对迭代器进行窗口映射的能力。

详细介绍如下:

  1. map_windows.rs 文件首先定义了一个 MapWindows<I> 结构体,其中 I 是一个实现了 Iterator trait 的类型。该结构体代表了一个对原始迭代器进行窗口映射的适配器。
  2. MapWindows<I> 结构体实现了 Iterator trait,因此可以调用 Iterator trait 中定义的方法,如 next()size_hint() 等。
  3. MapWindows<I> 结构体还包含一个 inner 字段,类型为 MapWindowsInner<I, Buffer<T>>,该字段负责实际的窗口映射逻辑。
  4. MapWindowsInner<I, Buffer<T>> 结构体定义了一个实现窗口映射逻辑的迭代器。其中 I 是原始迭代器的类型,Buffer<T> 是一个用于存储窗口元素的缓冲区类型。
  5. MapWindowsInner<I, Buffer<T>> 结构体实现了 Iterator trait,因此可以调用 Iterator trait 中定义的方法,如 next()size_hint() 等。它使用 Buffer<T> 来缓存窗口元素,当需要获取下一个窗口时,通过对原始迭代器的迭代和更新缓冲区来实现。

总结起来,rust/library/core/src/iter/adapters/map_windows.rs 文件中的结构体 MapWindows<I>MapWindowsInner<I, Buffer<T>> 提供了对原始迭代器进行窗口映射的功能。其中 MapWindows<I> 是对外的适配器,MapWindowsInner<I, Buffer<T>> 是实际实现窗口映射的迭代器。通过使用这两个结构体,可以在Rust代码中方便地对迭代器进行窗口映射操作。

File: rust/library/core/src/iter/adapters/filter_map.rs

在Rust的标准库中的iter/adapters/filter_map.rs文件包含了FilterMap适配器。

FilterMap适配器可以应用一个函数到一个迭代器的元素上,然后使用该函数的返回值创建一个新的迭代器。该适配器将过滤掉函数返回的None值,并只保留返回的Some值。

在该文件中,有以下几个结构体:

  1. FilterMap<I, F>:这是一个实现了Iterator trait的结构体。它持有一个初始迭代器 I,并且应用了一个函数 F 到迭代器中的每个元素上。这个函数根据需要返回一个Option类型的值。FilterMap结构体通过迭代器的next方法将元素应用到函数上,并过滤掉None值。
  2. FilterMap<I, F>::Item:这是迭代器返回的项类型。它是应用函数后所得到的Some值的类型。
  3. Guard<'a>:这是一个帮助结构体,用于处理迭代器中的生命周期问题。它确保持有的引用在生命周期 'a 内有效。

FilterMap适配器可以使用filter_map方法调用,例如:

代码语言:javascript复制
let numbers = vec![1, 2, 3, 4, 5];

let filtered_numbers = numbers
    .into_iter()
    .filter_map(|x| {
        if x % 2 == 0 {
            Some(x * 2)
        } else {
            None
        }
    })
    .collect::<Vec<i32>>();

println!("{:?}", filtered_numbers);  // 输出 [4, 8]

在上面的例子中,filter_map适配器将初始的迭代器numbers中的每个元素取出,并将其传递给闭包函数。如果元素是偶数,则该函数返回它的两倍包装在Some中,否则返回None。最终,filter_map产生一个新的迭代器,仅包含函数返回Some的元素,并且通过collect方法将这些元素收集到一个新的Vec中。最后的输出将是[4, 8]

File: rust/library/core/src/iter/adapters/chain.rs

在Rust的标准库中,rust/library/core/src/iter/adapters/chain.rs文件是链式适配器(chaining adapters)的实现。链式适配器用于连接两个迭代器(iterators),使它们在一起工作。

该文件中定义了一个名为Chain的结构体,它是一个迭代器适配器。Chain结构体有两个类型参数:AB,分别代表两个要连接的迭代器的类型。该结构体实现了Iterator trait,需要实现next方法来生成迭代器的下一个元素。

Chain结构体的主要作用是将两个迭代器连接在一起,形成一个新的迭代器。连接后的迭代器会首先迭代第一个迭代器的元素,然后再继续迭代第二个迭代器的元素,直到两个迭代器都遍历完毕。

Chain结构体中,还定义了一些其他的结构体,它们分别是IterInitIterFinIterfrom。这些结构体在实现Iterator trait时起到辅助的作用。

  • Iter结构体实现了Iterator trait,并负责迭代第一个迭代器的元素。
  • InitIter结构体用于在一个新的Chain迭代器中保存第一个迭代器,以便在需要时轻松重新生成它。
  • FinIter结构体用于在一个新的Chain迭代器中保存第一个迭代器已经迭代完的状态,以便在需要时跳过它。
  • from方法用于创建一个新的Chain迭代器。

通过这些结构体的协作,Chain迭代器能够正确地连接两个迭代器,并按照预期的顺序返回元素。

总之,rust/library/core/src/iter/adapters/chain.rs文件中的Chain结构体及其相关辅助结构体的作用是将两个迭代器连接在一起,形成一个新的迭代器,以便对它们进行连续的迭代操作。

File: rust/library/core/src/iter/adapters/peekable.rs

在Rust的标准库中,peekable.rs文件包含了Peekable适配器的实现。Peekable适配器可以用于在迭代器上进行"窥视(peek)"操作,即查看迭代器中下一个元素而不移除它。

具体来说,Peekable适配器有以下作用:

  1. 提供了对迭代器的一个包裹,它允许我们在不改变迭代器的情况下访问下一个元素。
  2. 提供了一个peek方法,返回迭代器中的下一个元素的一个引用,但不消费该元素。
  3. 能够根据需要消费下一个元素,继续迭代。

Peekable适配器是通过Iter结构实现的,它是一个泛型结构体,其中的Peekable<I>类型参数表示被包裹的迭代器的类型。Iter结构体实现了迭代器特质Iterator,因此它可以被用作迭代器。

除了Iter结构体,Peekable适配器还定义了其他几个相关的结构体:

  • PeekingNext<I>是一个迭代器适配器,用于在Peekable实例中保留下一个元素和迭代器本身。它与Iter结构体一起被用于保存迭代器的状态。
  • PeekingNextState是一个枚举类型,表示PeekingNext结构体可能处于的几种不同的状态,如等待迭代器产生下一个值、缓存下一个值等。
  • Peek<T>是一个迭代器适配器,用于在Peekable实例中保存下一个元素的缓存。

这些结构体的组合允许我们在迭代过程中检查迭代器中的下一个元素,而不改变迭代器移动到下一个元素的位置。

总结起来,peekable.rs文件的作用是实现了Peekable适配器,该适配器允许我们在Rust程序中对迭代器进行窥视操作,以便在需要时查看下一个元素。

File: rust/library/core/src/iter/adapters/mod.rs

在Rust源代码中,rust/library/core/src/iter/adapters/mod.rs是一个文件,它位于Rust的核心库中的iter模块中的adapters子模块下。该文件的作用是定义一系列适配器(adapters),这些适配器用于对迭代器进行转换、过滤、映射等操作,从而提供更丰富的迭代器功能。

具体来说,该文件中定义了多个结构体(struct)和特性(trait),下面对其中的一些进行介绍:

  1. GenericShunt<'a, A, B>:这是一个结构体,用于创建一个迭代器适配器,将一个迭代器转换为另一个具有不同元素类型的迭代器。它接受两个类型参数AB,分别表示输入和输出的元素类型。
  2. SourceIter:这是一个特性(trait),它定义了一系列方法用于对迭代器进行各种操作。其包括:
    • iter() -> Self:返回一个迭代器本身。
    • size_hint(&self) -> (usize, Option<usize>):返回一个元组,表示迭代器的最小和最大元素数量的估计。
    • next(&mut self) -> Option<Self::Item>:从迭代器中获取下一个元素并返回,如果迭代器已经遍历完毕,则返回None
    • advance_by(&mut self, n: usize) -> Result<(), usize>:从迭代器中跳过指定数量的元素。
    • nth(&mut self, n: usize) -> Option<Self::Item>:获取迭代器中的第n个元素。
    • for_each<F>(&mut self, f: F) where F: FnMut(Self::Item):对迭代器中的每个元素执行给定的闭包函数。

总而言之,adapters/mod.rs文件提供了一系列的迭代器适配器以及操作迭代器的方法,使编程者可以方便地对迭代器进行各种转换和操作。这些适配器和特性可以用于编写更简洁、可读性更高的代码,提高代码的可维护性和可重用性。

File: rust/library/core/src/iter/adapters/fuse.rs

在Rust源代码中,fuse.rs文件位于rust/library/core/src/iter/adapters/路径下,它定义了Fuse结构体和相关的FuseImpl特性。

Fuse结构体是一个迭代器适配器,用于限制包装的迭代器只能迭代一次。它的定义如下:

代码语言:javascript复制
pub struct Fuse<I> {
    iter: I,
    done: bool,
}

Fuse结构体包含两个字段:iterdoneiter是被包装的迭代器,done表示迭代是否已完成。

Fuse结构体实现了Iterator特性,因此可以调用Iterator特性中定义的方法,如next()for_each()等。但是,当被包装的迭代器完成一次迭代后,Fuse迭代器将变为不可用状态,即调用它的方法将不会产生任何结果。

FuseImpl特性是通过Fuse结构体实现的内部特性。该特性定义了Fuse结构体内部方法的约束和默认实现。它包含了以下几个方法:

  • iter(&mut self) -> &mut I:返回对被包装迭代器的可变引用。
  • iter_and():将Fuse结构体连同其内部的被包装迭代器一起返回。这在编写泛型算法时很有用。
  • iter_set():将Fuse结构体的done字段设置为指定的值。这在迭代器需要被重新初始化时使用。
  • is_done():检查Fuse结构体的done字段是否为true

总而言之,Fuse结构体和FuseImpl特性的作用是创建一个迭代器适配器,用于限制包装的迭代器只能迭代一次,并提供了相关的方法来操作和检查迭代器的状态。这有助于确保迭代器的一致性和可预测性,提高代码的可读性和可维护性。

File: rust/library/core/src/iter/sources/repeat.rs

在Rust源代码中,rust/library/core/src/iter/sources/repeat.rs文件的作用是定义了一个可以无限重复特定值的迭代器。

首先,这个文件定义了一个名为Repeat<A>的结构体,它代表一个可以无限重复值A的迭代器。该结构体实现了Iterator trait,使它可以通过迭代器的方式进行遍历。

Repeat<A>结构体的定义如下:

代码语言:javascript复制
pub struct Repeat<A> {
    element: A,
}

Repeat<A>结构体有一个类型参数A,它代表了重复的值的类型。结构体内部有一个字段element,用于存储重复的值。

Repeat<A>结构体还实现了Iterator trait,其中定义了next方法用于获取下一个重复的值。具体代码如下:

代码语言:javascript复制
impl<A> Iterator for Repeat<A> {
    type Item = A;

    fn next(&mut self) -> Option<Self::Item> {
        Some(self.element)
    }
}

next方法总是返回Some(self.element),表示下一个迭代器的元素是重复的值。由于Repeat<A>是无限重复的迭代器,因此其next方法不会返回None

这样,通过使用Repeat<A>结构体的实例,就可以无限重复特定值进行迭代操作。这对于需要在某些特定情况下无限制地重复一个值的操作非常有用。

File: rust/library/core/src/iter/sources/repeat_n.rs

在Rust源代码中,rust/library/core/src/iter/sources/repeat_n.rs文件的作用是定义了一个用于生成重复序列的迭代器。该文件实现了名为RepeatN的struct。

RepeatN结构表示一个迭代器,它将元素A重复N次。它有以下主要成员函数和特性:

  1. fn new(value: A, count: usize) -> RepeatN<A>:构造函数,创建一个RepeatN实例,指定要重复的元素和重复的次数。
  2. fn cloned(self) -> RepeatN<<A as Clone>::Output>:返回一个新的RepeatN迭代器,其中的元素类型是可克隆的。这可以用于复制不可克隆类型的元素。
  3. fn count(self) -> usize:返回迭代器要重复的次数。
  4. fn size_hint(&self) -> (usize, Option<usize>):返回迭代器的估计大小。

RepeatN迭代器实现了Iterator特性,因此可以使用Iterator上的各种方法,例如:

  1. fn take(self, n: usize) -> Take<Self>:返回一个新的迭代器,只产生前n个元素。
  2. fn skip(self, n: usize) -> Skip<Self>:返回一个新的迭代器,跳过前n个元素并产生剩下的元素。
  3. fn nth(&mut self, n: usize) -> Option<Self::Item>:返回迭代器中的第n个元素,如果不存在则返回None。

RepeatN是Rust标准库中的基本实现,它可以用于生成具有重复值的迭代器,以满足不同的编程需求。

File: rust/library/core/src/iter/sources/once_with.rs

rust/library/core/src/iter/sources/once_with.rs文件的作用是定义了一个包含单次产生元素的迭代器,即OnceWith迭代器。

在该文件中,定义了三个结构体:OnceWith、FutureState和OnceWithIter。

  1. OnceWith结构体:它是一个类似于函数指针的类型,可以存储一个通过 FnOnce() -> T 来产生一个元素的闭包。OnceWith结构体主要用于存储这个闭包,以便在需要时调用它。
  2. FutureState结构体:它是一个包含闭包的可移动的future状态。FutureState结构体实现了Future trait,用于在需要时通过调用闭包来产生元素。
  3. OnceWithIter结构体:它是实现了Iterator trait的结构体,并使用OnceWith和FutureState来实现单次产生元素的迭代器。OnceWithIter结构体包含了一个OnceWith和一个Option<FutureState>。OnceWithIter结构体通过实现Iterator的next()方法来提供迭代器的实现。在第一次调用next()时,它会调用OnceWith包含的闭包生成一个FutureState对象,并将其存储在Option中。随后每次调用next()时,它会从Option中获取FutureState对象,并通过调用poll()方法来获取闭包产生的元素。

总的来说,once_with.rs文件定义了一个用于单次产生元素的迭代器,其中包括OnceWith结构体,用于存储闭包,FutureState结构体用于在需要时产生元素,以及OnceWithIter结构体用于实现单次产生元素的迭代器。

File: rust/library/core/src/iter/sources/successors.rs

在Rust的核心库中,successors.rs 文件定义了一个名为 Successors 的迭代器源(Iterator Source)。该文件包含了与迭代器和后继值(successor value)相关的结构体和函数。

首先,让我们来了解一下 Successors 结构体的作用。Successors 是一个结构体,实现了 Iterator trait,并用于生成一个迭代器。它的作用是接收一个函数和一个初始值,然后通过该函数不断生成后继值来产生一个迭代器。

具体来说,Successors 结构体有以下几个字段和方法:

  1. fn new(init: T, f: F) -> Successors<T, F>:一个关联函数,用于创建一个 Successors 实例。它接收一个初始值 init 和一个函数 f,并返回一个 Successors 迭代器。
  2. init: T:初始值,保存了迭代器的当前状态。
  3. f: F:一个闭包或函数对象,用于生成后继值。
  4. fn successor(&mut self) -> Option<T>:一个私有方法,用于生成下一个后继值。它会调用闭包或函数对象 f,将当前状态作为参数传递给它,并返回生成的后继值。如果后继值为 None,表示迭代结束。
  5. impl<T, F> Iterator for Successors<T, F>:对 Iterator trait 的实现。它提供了 Iterator 接口的方法,如 next()size_hint()fold() 等。

Successors 迭代器源可以逐步生成新的值,这些值由提供的函数生成。这在需要生成一系列相关的值时非常有用,可以避免预先生成所有值的开销和内存占用。

此外,在 successors.rs 文件中还有一些与 Successors 相关的辅助函数和单元测试代码,用于验证和测试迭代器的正确性和性能。

总结起来,rust/library/core/src/iter/sources/successors.rs 文件中的 Successors 结构体和相关函数定义了一个能够生成后继值的迭代器源,用于逐步生成一系列相关的值。

File: rust/library/core/src/iter/sources/from_generator.rs

在Rust的源代码中,rust/library/core/src/iter/sources/from_generator.rs文件的作用是提供一个用于从生成器创建迭代器的实现。

生成器是一种类似于迭代器的抽象,它可以生成一系列值。生成器是使用特殊关键字yield编写的函数,每次调用生成器,它都会生成一个值并暂停,然后可以在需要时再次恢复执行。生成器通常用于异步编程、状态机和懒计算等场景。

在这个文件中,有一个名为FromGenerator<G>(G)的结构体。这个结构体实现了迭代器的Iterator特性,并提供了从生成器创建迭代器的功能。

具体来说,FromGenerator结构体包含一个G类型的字段,表示生成器。它的主要作用是通过实现Iterator特性中的相关方法,将生成器转换为迭代器。这样,我们就可以在Rust中使用生成器来创建迭代器,并使用迭代器的各种方法来处理生成器生成的值。

FromGenerator结构体的实现中包含了以下几个方法:

  1. next(&mut self) -> Option<Self::Item>: 这个方法用于获取生成器生成的下一个值。它会调用生成器的resume方法来继续执行生成器函数,并返回生成的值。如果生成器已经完成了所有的值的生成,则返回None
  2. size_hint(&self) -> (usize, Option<usize>): 这个方法用于提供迭代器的大小提示。它会调用生成器的size_hint方法来获取生成的值的数量范围。返回的元组中,第一个元素表示最小值的估计,第二个元素表示最大值的估计,如果没有确定的上限,则为None。在这个实现中,由于生成器可能无法提供确定的大小提示,因此总是返回(0, None)
  3. try_fold<B, F, R>(&mut self, init: B, f: F) -> R: 这个方法用于将迭代器的每个元素进行合并操作。它会调用生成器的resume_with方法来执行生成器函数,将生成的值传递给提供的闭包函数进行合并操作。该方法将返回合并操作的结果。

总的来说,FromGenerator结构体的作用是将生成器转换为迭代器,使我们可以使用Rust的迭代器特性来处理生成器生成的值。

File: rust/library/core/src/iter/sources/repeat_with.rs

在Rust源代码中, rust/library/core/src/iter/sources/repeat_with.rs 文件的作用是提供一个用于创建重复某个值的迭代器的实现。

该文件中定义了一个名为 RepeatWith 的结构体。RepeatWith 是一个迭代器适配器,它将给定的函数闭包作为参数,然后在每次迭代时调用该闭包以产生新的元素。

RepeatWith<F> 是一个泛型结构体,其中 F 是一个闭包类型。该结构体实现了 Iterator 特性,因此可以使用迭代器的方法来操作生成的元素序列。

需要注意的是,RepeatWith 的泛型类型参数 F 必须是一个无参闭包,返回类型为实现了 Copy 特性的值。因为当迭代器的 next 方法被调用时,闭包函数将会被重复调用以生成新的元素,而每个元素都会进行 Copy 操作。

RepeatWith 结构体主要定义了以下几个方法:

  1. next 方法:该方法返回一个 Option 类型的引用,代表迭代的下一个元素。在每次调用 next 方法时,都会调用闭包函数生成一个新的元素,并将其封装在 Some 中返回。如果闭包函数返回 None,则表示迭代结束,此时 next 方法将返回 None
  2. size_hint 方法:该方法返回一个元组,包含对生成的元素序列个数的提示。由于 RepeatWith 是一个无穷迭代器,因此该方法将返回 (usize::MAX, None),表示元素个数是无限的。
  3. nth 方法:该方法按指定的索引跳过一定数量的元素,并返回迭代序列中的某个元素。由于 RepeatWith 是无穷迭代器,因此 nth 方法将始终返回闭包函数生成的元素。
  4. 其他常用的迭代器方法,如 take, skip 等。

通过 RepeatWith 结构体,我们可以使用给定的闭包函数在迭代序列中生成重复的元素。这在某些算法和逻辑中非常有用,允许我们在迭代器中重复使用相同的值,而不必手动重复编写相同的代码。

File: rust/library/core/src/iter/sources/from_fn.rs

在Rust源代码中,rust/library/core/src/iter/sources/from_fn.rs文件的作用是定义了一个实现FromIterator trait的struct FromFn<F>(F),以及该struct的相关方法和impl。

首先,让我们来了解一下FromIterator trait的作用。FromIterator trait是一个定义了从一个迭代器创建新类型的能力的trait。在Rust中,可以通过实现FromIterator trait来自定义集合类型的创建方式。

FromFn<F>(F) struct则是FromIterator trait的一个实现。它是一个泛型struct,接受一个闭包作为参数。通过这个闭包,我们可以定义在迭代过程中产生每个元素的逻辑。

接下来,让我们详细看一下FromFn<F>(F) struct的作用。

首先是struct的定义:

代码语言:javascript复制
pub struct FromFn<F>(F);

其中,FromFn是struct的名字,<F>表示FromFn是一个泛型struct,F是泛型参数。这个结构体接受一个泛型参数F,表示一个闭包。

接下来是struct的impl部分。首先,它实现了FromIterator trait:

代码语言:javascript复制
impl<I, F> FromIterator<I> for FromFn<F>
    where F: FnMut() -> Option<I>

这表示FromFn<F> struct可以从一个迭代器中创建,该迭代器产生类型为I的元素。这个实现通过闭包F来描述如何生成每个元素。闭包有FnMut() -> Option<I>类型,表示它接受无参数并返回一个Option<I>类型的值。

之后,它实现了Iterator trait:

代码语言:javascript复制
impl<I, F> Iterator for FromFn<F>
    where F: FnMut() -> Option<I>

这表示FromFn<F> struct可以被视为一个迭代器,可以使用迭代器相关的方法操作它。这个实现定义了next()方法,用于在每次迭代中生成下一个元素。

另外,它还实现了DoubleEndedIterator trait和ExactSizeIterator trait,分别用于支持双向迭代和精确大小的迭代。

总的来说,rust/library/core/src/iter/sources/from_fn.rs文件中的FromFn<F> struct的作用是自定义一个可从迭代器中生成新类型的创建方式。通过使用闭包F,我们可以定义生成每个元素的逻辑,并且该struct还实现了Iterator trait以及另外几个相关的trait,使得我们可以使用常见的迭代器方法对其进行操作和使用。

File: rust/library/core/src/iter/sources/once.rs

once.rs文件是Rust标准库中的一个文件,位于core/src/iter/sources/目录下。该文件中定义了一个名为Once<T>的结构体,用于表示一次性可迭代的元素。

Once<T>结构体的作用是将一个元素封装为可迭代的,该元素只能被遍历一次。在Rust中,Once<T>常用于将一个值包装为可迭代的形式,以便在使用迭代器的上下文中对该值进行遍历。通常情况下,可以通过将需要迭代的元素作为参数传递给iter_once函数来创建Once<T>实例。

Once<T>结构体实现了Iterator trait,因此可以使用迭代器的相关方法,比如for循环、mapfilter等操作。但由于Once<T>是一次性的,所以只能进行一次遍历。一旦遍历完成,再次尝试遍历将返回None

Once<T>结构体中,包含了以下几个字段和方法:

  1. state: Cell<u8>:一个Cell<u8>类型的字段,用于存储遍历状态。Cell提供了内部可变性,允许在不使用&mut self的情况下修改字段的值。
  2. value: UnsafeCell<T>:一个UnsafeCell<T>类型的字段,用于存储封装的元素值。UnsafeCell提供了内部可变性,允许在不使用&mut self的情况下修改字段的值。
  3. new(value: T) -> Once<T>:一个关联函数,用于创建一个新的Once<T>实例,并初始化其中的字段。
  4. state(&self) -> &Cell<u8>:一个方法,返回state字段的引用。
  5. value(&self) -> &UnsafeCell<T>:一个方法,返回value字段的引用。
  6. finalize_drop(&self):一个方法,用于在迭代完成后调用,将state设置为已完成状态。
  7. forget:一个方法,将state设置为已完成状态,忘记迭代器。这样做很危险,因为忘记后再次使用迭代器会导致未定义行为。

总之,once.rs文件中的Once<T>结构体是一个用于一次性遍历元素的迭代器。通过调用new方法将元素包装为Once<T>实例,可以在迭代器上下文中对该元素进行遍历。一旦遍历完成,再次尝试遍历将返回None

File: rust/library/core/src/iter/sources/empty.rs

在Rust源代码中,rust/library/core/src/iter/sources/empty.rs文件的作用是定义了一个名为empty()的函数,并提供了一个实现Iterator trait的Empty迭代器。这个文件的作用是创建一个空的迭代器。

首先,让我们看一下Empty结构体的定义:struct Empty<T>(marker::PhantomData<T>)。这是一个泛型结构体,它接收一个类型参数TEmpty结构体中使用了marker::PhantomData,它是一个用来标记类型占位符的类型,不占用内存空间,只用于编译时类型检查。在这个结构体中,它的作用是为了让编译器知道泛型类型TEmpty结构体中是被使用的。

接下来,让我们来看empty()函数的定义:pub fn empty<T>() -> Empty<T>。这个函数是一个公有的函数,没有参数,返回一个Empty<T>类型的空迭代器。由于empty()函数是泛型的,可以根据调用者的需要返回不同类型的空迭代器。

Empty结构体实现了Iterator trait,使得它可以被遍历。Iterator trait是Rust标准库中的一个特征,定义了迭代器的操作和行为,包括next()方法来获取下一个元素。

由于Empty迭代器是一个空的迭代器,它不包含任何元素。当你调用next()方法来获取下一个元素时,它会始终返回None,表明迭代已经结束。

这个empty()函数和Empty结构体在编程中有很多用途。例如,当你需要一个空的集合或者生成器时,可以使用它们来表示。此外,它们还可以作为其他算法和操作的基础,例如过滤、映射等。

总结起来,rust/library/core/src/iter/sources/empty.rs文件中的empty()函数和Empty结构体的作用是提供了一个空的迭代器,用于表示没有任何元素的情况。这样可以方便地在编程中使用这个空迭代器,并进行相关操作。

File: rust/library/core/src/iter/range.rs

在Rust源代码中,rust/library/core/src/iter/range.rs文件的作用是定义范围迭代器(range iterator)相关的结构和特性。

详细来说,这个文件中包含了以下几个重要的结构体和特性:

  1. Step 结构体:这个结构体定义了范围迭代器的步长(step),用来确定迭代器每次移动的间隔大小。默认情况下,步长为1。这个结构体还提供了一些函数和方法,用于计算范围的长度和检查给定的范围是否有效。
  2. RangeIteratorImpl 特性:这个特性定义了范围迭代器的公共接口,包括 Iterator 特性所定义的方法和操作符重载。范围迭代器通过实现这个特性,可以使用for循环和其他迭代器相关的功能。
  3. RangeInclusiveIteratorImpl 特性:这个特性是RangeIteratorImpl的扩展,用来支持范围包含结束值(inclusive)的迭代器。在这种迭代器中,范围的结束值也会被包含在迭代的结果中。

总的来说,这个文件定义了用于创建和操作范围(range)的迭代器,包括确定范围的开始、结束和步长,以及迭代器的行为和功能。范围迭代器可用于循环遍历一定范围内的元素,如整数、字符等。

File: rust/library/core/src/iter/sources.rs

在Rust源代码中,rust/library/core/src/iter/sources.rs是一个文件,其作用是实现了各种迭代器的来源。

在Rust中,迭代器是一种遍历集合元素的方式。源代码文件sources.rs包含了与迭代器来源相关的实现。这些迭代器来源包括数组、切片、范围、迭代器包装类型等等。该文件中定义了各种实现,以便可以通过不同的来源创建不同类型的迭代器。

具体来说,sources.rs中包含以下功能:

  1. 实现了从数组中创建迭代器的方法,通过实现From<[T; N]> trait,可以将数组转换为迭代器,使得可以对数组进行迭代操作。
  2. 实现了从切片中创建迭代器的方法,通过实现From<&[T]> trait,可以将切片转换为迭代器,使得可以对切片进行迭代操作。
  3. 实现了从范围(Range)中创建迭代器的方法,通过实现Iterator trait,可以对范围内的元素进行迭代。
  4. 实现了针对Option类型的迭代器来源,使得可以对Option类型的值进行迭代操作。
  5. 实现了对Iterator类型的迭代器来源的包装,通过实现FromIterator trait,可以将Iterator类型的迭代器转换为另一种类型的迭代器。这使得可以对已有的迭代器进行更灵活的操作。

通过这些实现,sources.rs文件为Rust中的迭代器提供了丰富的来源类型,使得可以对不同来源的数据进行迭代操作。这对编写高效和可靠的Rust代码非常重要,因为迭代器是Rust语言中经常使用的重要概念。

File: rust/library/core/src/iter/mod.rs

在Rust源代码中,rust/library/core/src/iter/mod.rs这个文件是Rust标准库中iter模块的实现文件。该模块包含了许多与迭代器相关的功能和类型。

迭代器是Rust中非常重要的概念,它提供了一种方便的方式来遍历集合或序列中的元素。iter模块所提供的功能主要有以下几个方面:

  1. 基本迭代器类型:该模块定义了一系列用于迭代的类型,如IteratorDoubleEndedIteratorExactSizeIterator等。这些类型提供了一组方法,使得用户可以对集合进行迭代、过滤、映射等操作。
  2. 迭代器适配器:除了基本的迭代器类型外,iter模块还提供了一系列的迭代器适配器。适配器是可用于在现有迭代器上进行链式操作的函数,例如map()filter()take()等。这些适配器可以对现有的迭代器进行转换、筛选、拼接等操作,以便用户可以根据具体需求来灵活地处理数据。
  3. 迭代器合成:iter模块还提供了一些函数用于合成新的迭代器。例如zip()可以将两个迭代器的元素逐对进行配对,chain()可以将多个迭代器合成一个新的迭代器。这些函数可以用于处理多个迭代器之间的关系,使得用户可以更加灵活地组合和处理数据。
  4. 迭代器的运算:除了基本的迭代器功能之外,iter模块还提供了一些函数用于实现迭代器之间的运算。例如max()函数可以找到迭代器中的最大值,sum()函数可以对迭代器中的元素求和,count()函数可以统计迭代器中元素的个数等。这些函数可以方便地对迭代器中的数据进行处理和计算。

总之,rust/library/core/src/iter/mod.rs是Rust标准库中迭代器相关功能的实现文件,提供了一系列的类型、函数和方法,用于处理和操作迭代器。通过使用这些功能,用户可以更加方便地遍历、转换和组合集合中的元素,并对元素进行各种各样的操作。

File: rust/library/core/src/char/decode.rs

在Rust源代码中,rust/library/core/src/char/decode.rs文件主要用于定义与Unicode字符编码相关的解码操作。

具体来说,DecodeUtf16<I>是一个结构体,它实现了Iterator trait,并提供了将UTF-16编码的输入流解码成Unicode字符的功能。其字段包括:

  • iter: 一个实现了DoubleEndedIterator<Item = u16> trait的输入流。
  • big_endian: 表示输入流的字节序是否为大端序(Big-Endian)。如果是,则解码时会假设输入流为大端序;如果不是,则会交换字节序后再进行解码。
  • last_surrogate: 缓存上一个UTF-16编码过程中的低代理项(low surrogate),用于与当前高代理项(high surrogate)组合生成编码后的Unicode字符。

DecodeUtf16<I>的实例可以通过调用iter()方法生成,该方法返回一个解码后的Unicode字符流。

DecodeUtf16Error是一个结构体,表示处理UTF-16编码时出错的情况。它的字段包括:

  • unpaired_surrogate: 未配对的代理项(surrogate)。
  • error_len: 引起错误的UTF-16编码单元个数。

DecodeUtf16Error的实例可以通过From trait将core::char::DecodeUtf16Error类型的错误转换为该类型。

总结来说,rust/library/core/src/char/decode.rs文件中的DecodeUtf16<I>结构体提供了将UTF-16编码的输入流解码成Unicode字符的功能,而DecodeUtf16Error结构体用于处理UTF-16编码时可能出现的错误情况。这些结构体是Rust源代码中处理Unicode字符编码的重要组成部分。

File: rust/library/core/src/char/convert.rs

在Rust的源代码中,rust/library/core/src/char/convert.rs文件是一个非常重要的文件,它定义了一些与字符转换相关的功能和类型。让我们逐一介绍它的作用。

首先,这个文件定义了一个名为ParseCharError的结构体。这个结构体是用来处理字符解析错误的,当尝试将字符串解析为字符时出现错误时,该结构体会被返回。它包含了一个描述错误原因的字符串,并提供了方法来访问和处理这个错误。

其次,还定义了一个名为CharTryFromError的结构体。这个结构体用于处理将类型转换为字符时可能出现的错误。它提供了一些方法来处理这些错误,并通过内部的TryFrom特性来实现类型转换的错误处理。

另外,还定义了一个枚举类型CharErrorKind,该枚举中定义了一些可能的字符错误类型。这些错误类型包括无效的Unicode码点、不支持的Unicode标量值范围以及无效的UTF-8编码。这些错误类型可以用于更具体地描述字符转换中的错误。

总而言之,rust/library/core/src/char/convert.rs文件的作用是定义了一些与字符转换相关的错误处理类型和功能,以便在处理字符转换过程中能够更好地处理错误情况。这些类型和功能对于开发者在处理字符转换时能够更加精确地定位和处理错误非常有帮助。

File: rust/library/core/src/char/methods.rs

在Rust源代码中,rust/library/core/src/char/methods.rs这个文件的作用是定义了char类型的一些方法和相关的trait方法。下面对该文件的内容进行详细介绍:

  1. 首先,该文件定义了一个名为EscapeDebugExtArgs的pub结构体。它是一个空结构体,没有任何字段。该结构体用于扩展Rust中的char类型,为它添加新的方法。
  2. 然后,该文件还定义了一些与char类型相关的trait方法。这些方法为char类型提供了一些额外的功能和操作。
    • EscapeDebugExt trait:该trait为char类型添加了escape_debug方法,用于将char类型的字符转换为适合用于调试输出的字符串形式。
    • ToLowercaseToUppercase traits:这两个traits为char类型提供了将字符转换为小写和大写形式的方法。
    • is_ascii_* traits:这些traits为char类型提供了判断字符是否为ASCII字符的方法。
    • EscapeUnicodeEscapeDefault traits:这两个traits为char类型提供了将字符转义为Unicode码点和默认转义序列的方法。
    • CaseIgnorable trait:该trait用于判断字符是否为Unicode标准中可忽略大小写的字符。
    • ParseCharError 类型:该结构体代表了在解析字符过程中可能出现的错误。
    • EscapeDebug trait:该trait定义了将字符转义为适合调试输出的字符串的方法。
    • Lossy<char> trait:该trait定义了由字符转换为Unicode码点中可能丢失信息的方法。
    • char 结构体实现了EscapeDebugExtCloneCopyEqPartialEqOrdPartialOrdHash等traits。

以上是rust/library/core/src/char/methods.rs文件的主要内容。通过这些方法和traits,我们可以方便地对char类型进行各种操作和转换。

至于EscapeDebugExtArgs结构体,根据代码注释的解释,它仅用于制造方法链的目的。它的存在使得链式调用char类型的方法时更具有可读性和表达力。实际上,这个结构体不会影响方法的行为,它只是为代码提供了一个美观和可读性更好的方式来调用相关的方法。这样,在代码中使用方法链时,可以更清晰地看到每个方法的目的和作用。

参考资料

[1]

5 Ways Rust Programming Language Is Used: https://www.understandingrecruitment.com/knowledge-hub/blog/5-ways-rust-programming-language-is-used/

0 人点赞