rustcollect() 一般如何创建不同的集合

rub*_*buc 4 rust

根据文档,此方法https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect可以根据其返回值分配给的变量的类型创建不同的集合。我已经研究这个有一段时间了,但我找不到它能够做到这一点的关键原因。一般情况下它是否超载?它如何能够根据变量类型创建不同的类型?

我知道类型推断在这里发挥着作用,但我更困惑的是它如何与实际的底层实现协同工作collect()

我开始学习 Rust,所以这个概念对我来说是新的。我正在阅读《生锈》书并搜索过此内容,但找不到我要找的内容。

先感谢您!

链接中的示例:

// This

let a = [1, 2, 3];

let doubled: Vec<i32> = a.iter()
                         .map(|&x| x * 2)
                         .collect();

assert_eq!(vec![2, 4, 6], doubled);

// Compared to this

use std::collections::VecDeque;

let a = [1, 2, 3];

let doubled: VecDeque<i32> = a.iter().map(|&x| x * 2).collect();

assert_eq!(2, doubled[0]);
assert_eq!(4, doubled[1]);
assert_eq!(6, doubled[2]);
Run Code Online (Sandbox Code Playgroud)

Evi*_*Tak 5

请注意,该Iterator::collect方法的泛型类型参数实现了该FromIterator特征。这就是所有魔法发生的地方——如果您查看 的源代码Iterator::collect<B>您会发现它所做的只是调用FromIterator::from_iter。由于编译器期望返回值的类型为B,因此它推断指的是onFromIterator::from_iter的实现(作为returns )。FromIterator::from_iterBfrom_iterSelf

如果您查看 的实现FromIterator,您会发现许多标准集合类型(以及其他类型)都喜欢VecVecDeque实现此特征,因此可以被collect编辑。在编译这行代码时将所有内容放在一起

let v: Vec<_> = some_iterator.collect()
Run Code Online (Sandbox Code Playgroud)

编译器首先将方法B的类型参数设置collect为be Vec<_>(因为collect返回a ),然后在函数体中B调用for的实现来收集到a 。FromIterator::from_iterVec<T>Iterator::collectsome_iteratorVec