gpt4 book ai didi

generics - 如何实现类似于 HashMap::entry 的不消耗 key 的功能?

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

我正在尝试实现类似于 HashMap::entry 但不允许使用 key 的东西(参见 this RFC 具有类似目的)。这是我的代码,以 HashMapIndex impl 为模型(参见 thisthis)。

use std::collections::HashMap;
use std::hash::{Hash, BuildHasher};
use std::borrow::Borrow;

trait MapExt<Q: ?Sized, V> {
fn get_or_insert(&mut self, key: &Q, value: V) -> &V;
}

impl<'a, Q: ?Sized, K, V, S> MapExt<&'a Q, V> for HashMap<K, V, S>
where
K: Eq + Hash + Borrow<Q>,
Q: Eq + Hash + ToOwned,
S: BuildHasher,
{
fn get_or_insert(&mut self, key: &Q, value: V) -> &V {
if !self.contains_key(key) {
self.insert(key.to_owned(), value);
}
self[key]
}
}

这给了我以下错误。

error[E0053]: method `get_or_insert` has an incompatible type for trait
--> src/main.rs:15:42
|
6 | fn get_or_insert(&mut self, key: &Q, value: V) -> &V;
| -- type in trait
...
15 | fn get_or_insert(&mut self, key: &Q, value: V) -> &V {
| ^^ expected reference, found type parameter
|
= note: expected type `fn(&mut std::collections::HashMap<K, V, S>, &&'a Q, V) -> &V`
found type `fn(&mut std::collections::HashMap<K, V, S>, &Q, V) -> &V`

这里有什么问题,我该如何解决?

我认为会出现的另一个问题是编译器不知道Q::Owned 是否是K。如果是,我们如何处理?

最佳答案

我也是一个比较新手,但是从我看来存在三个问题:

MapExt<&'a Q, V>

应该是

MapExt<Q, V>

否则,您会将特征类型更改为引用。

Q: Eq + Hash + ToOwned,

应该是明确的

Q: Eq + Hash + ToOwned<Owned=K>,

这样它就知道 to_owned() 将返回什么类型。

self[key]

应该是

&self[key]

关于generics - 如何实现类似于 HashMap::entry 的不消耗 key 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853999/

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