Rust 中为什么可以将 Range 收集到 HashMap 或 Vec 中?

问题描述 投票:0回答:1

最近在学习迭代器时遇到了一个问题。我尝试将数字列表转换为

Vec
,但是当我将类型更改为
HashMap
时,没有发生错误。例如:

type Test = Vec<(usize, Vec<usize>)>;
// type TestHashMap = HashMap<usize, Vec<usize>>;

...
fn make_heavy_things() -> Test {
    let x = (1..=10).map(|v| (v, vec![v])).collect();
    x
}

// x can be a HashMap or Vec depending on the return type

这两种类型似乎都可以正常工作,并且像

len()
这样的常见方法可以按预期工作。我很好奇这种行为背后的原因。

rust hashmap iterator vec
1个回答
0
投票

Rust 中为什么可以将 Range 收集到 HashMap 或 Vec 中?

范围不能收集到哈希映射中,哈希映射需要键和值对,范围不是,您的迭代器不是范围,它是映射到一对(usize, Vec<usize>)

的范围。

我很好奇这种行为背后的原因。

Iterator::collect

是一个通用操作,它可以收集到任何实现FromIterator
特质
的东西中,这是
Vec
HashMap
的情况,IFF迭代器返回对(2-uples)该对的第一个元素实现 
Hash + Eq

这提供了类型安全的一站式服务,用于将迭代器转换为各种形式,并允许有用的组合,例如,

您可以将 Result

 的迭代器收集到单个 
Result
 中,它将在第一个 
处停止Result::Err
它遇到并返回它,否则将收集到您指定的任何具体集合中

我最近遇到一个问题

为什么会出现问题?

© www.soinside.com 2019 - 2024. All rights reserved.