根据文档,此方法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)
请注意,该Iterator::collect方法的泛型类型参数实现了该FromIterator特征。这就是所有魔法发生的地方——如果您查看 的源代码,Iterator::collect<B>您会发现它所做的只是调用FromIterator::from_iter。由于编译器期望返回值的类型为B,因此它推断指的是onFromIterator::from_iter的实现(作为returns )。FromIterator::from_iterBfrom_iterSelf
如果您查看 的实现者FromIterator,您会发现许多标准集合类型(以及其他类型)都喜欢Vec并VecDeque实现此特征,因此可以被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
| 归档时间: |
|
| 查看次数: |
3038 次 |
| 最近记录: |