gpt4 book ai didi

rust - rust collect() 如何通用地创建不同的集合

转载 作者:行者123 更新时间:2023-12-05 01:28:27 25 4
gpt4 key购买 nike

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

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

我刚开始学习 Rust,所以这个概念对我来说很陌生。我正在阅读 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]);

最佳答案

注意 Iterator::collect 的泛型类型参数方法实现了 FromIterator 特征。这就是所有魔法发生的地方——如果您查看 sourceIterator::collect<B> , 你会看到它所做的只是调用 FromIterator::from_iter .由于编译器期望返回值的类型为 B , 它推断出 FromIterator::from_iter指的是FromIterator::from_iter的执行在 B (因为 from_iter 返回 Self )。

如果你看implementorsFromIterator ,您会看到许多标准集合类型(以及其他类型),例如 VecVecDeque实现这个特性,因此可以是 collect进入。在编译代码行时将所有内容放在一起

let v: Vec<_> = some_iterator.collect()

编译器首先设置类型参数Bcollect方法是Vec<_> (因为 collect 返回一个 B ),然后调用 implementationFromIterator::from_iter对于 Vec<T>Iterator::collect 的函数体中收藏some_iterator进入Vec .

关于rust - rust collect() 如何通用地创建不同的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68607334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com