我想實現類似的東西來HashMap::entry
但允許不消耗鍵(見this RFC有類似的目的)。這裏是我的代碼,該Index
impl
爲HashMap
藍本(見this和this)。如何實現一個類似於不使用密鑰的HashMap :: entry的函數?
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
。如果是這樣,我們該如何處理?
雖然這個工作,只是要小心,我不能告訴你,如果有更好的方法完全是因爲我太學:P – loganfsmyth
謝謝,這與Shepmaster的回答結合清除我的理解。一個問題:我不知道「已有的」語法 - 它何時適用?只針對類型特徵?任何參考將有所幫助。 –
顯式設置「ToOwned」特徵的「關聯類型」是語法。如果你看看https://doc.rust-lang.org/std/borrow/trait.ToOwned.html,你可以看到'Owned'是'to_owned'的返回值的類型。 – loganfsmyth