我想写一个简单的回忆录函数.
fn memoize<K: Eq + Hash, V: Clone>(mut func: impl FnMut(&K) -> V) -> impl FnMut(K) -> V {
let mut cache = HashMap::new();
|key| {
cache
.entry(key)
.or_insert_with_key(|k| func(k))
.clone()
}
}
Eq + Hash
的参数范围似乎合理,但Clone
的返回值似乎是不必要的.理想情况下,签名应为:
fn memoize<K: Eq + Hash, V>(mut func: impl FnMut(&K) -> V) -> impl FnMut(K) -> &mut V
这需要指定返回引用的生存期(这是有意义的).
理想情况下,&mut V
应该在引用函数的生命周期内一直存在(或类似的情况:&'a mut impl FnMut(K) -> &'a mut V
)
由于FN特征的隐含是不稳定的,如果我想留在FN特征中(不是用大约fn call(&'a mut self, key: K) -> &'a mut V
个来写我的 struct ),有没有办法在稳定 rust 蚀中做到这一点?