gpt4 book ai didi

hashmap - 带有 HashMap 查找的迭代器映射。在任何不存在的 key 上失败

转载 作者:行者123 更新时间:2023-11-29 08:10:06 25 4
gpt4 key购买 nike

我有一个 String以冒号分隔的值。每个子字符串都应该是映射中的键。我想写一个函数来转换 String进入 Vec映射值,或者如果任何键不存在则失败。

到目前为止,我的尝试还不完整,但我正在逐步推进。第一步是将字符串转换为可选的向量 u32秒。 (这可能不是最好的方法):

fn parse(string: &String, lookup: HashMap<String, u32, FastHasher>) -> Vec<Option<u32>> {
string.split(":").map(|s: &str| lookup.get(s)).collect()
}

这导致

error: the trait bound `std::vec::Vec<std::option::Option<u32>>: std::iter::FromIterator<std::option::Option<&u32>>` is not satisfied [--explain E0277]
--> <anon>:8:52
|>
8 |> string.split(":").map(|s: &str| lookup.get(s)).collect()
|> ^^^^^^^
note: a collection of type `std::vec::Vec<std::option::Option<u32>>` cannot be built from an iterator over elements of type `std::option::Option<&u32>`

我相信这意味着我需要为 Option<&u32> 导入或编写自己的自迭代器行为,对吧?

完成后,我如何包装 OkErr取决于任何 None 的存在是吗?

最佳答案

HashMap::get() 方法返回一个可选的引用 到 map 内部的值。所以你有一个遍历 Option<&u32> 的迭代器, 但你想要一个遍历 Option<u32> 的迭代器.这是通过说:

lookup.get(s).cloned()
// ^^^^^^^^^

这使您当前的代码可以编译。


回答标题中的问题:有一个整洁的小 FromIterator 实现:

impl<A, V> FromIterator<Option<A>> for Option<V> where V: FromIterator<A>

这意味着,例如,您可以收集类型为 Option<u32> 的项目的迭代器进入Option<Vec<u32>> .这正是您想要的!所以只需更改您的返回类型:

fn parse(string: &str, lookup: &HashMap<String, u32, FastHasher>) -> Option<Vec<u32>> {
// ^^^^^^^^^^^^^^^^
string.split(":").map(|s| lookup.get(s).cloned()).collect()
}

您可以尝试工作代码here on playground .


另请注意我所做的以下与问题无关的更改:

  • string参数是 &str现在代替 &String .几乎没有理由通过 &String而不是 &str , 因此后者更通用,因此更受欢迎。
  • 不需要闭包参数的显式类型注释。
  • 您可能想传递对 HashMap 的引用,因为您的函数不需要拥有它。

关于hashmap - 带有 HashMap 查找的迭代器映射。在任何不存在的 key 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39717775/

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