我想写一个简单的记忆化函数。
需要指定返回引用的生命周期(这很有意义)。
理想情况下,
由于 Fn traits 的实现不稳定,如果我想在 Fn traits 内部留下(而不是编写带有
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 traits 的实现不稳定,如果我想在 Fn traits 内部留下(而不是编写带有
fn call(&'a mut self,key: K) -> &'a mut V
的结构体),那么在稳定版的 Rust 中是否有方法可以实现?
&mut V
是否有意义。为什么不使用&V
呢? - Thomas&K
可能也是有意义的,但这时你需要K: Clone
。它可以让你避免在键已经存在于映射中的情况下进行克隆(这可能是常见情况)。 - ThomasFnMut
。如果您改为使用显式结构,则可以正常工作,尽管使用方法比直接调用略微不太方便:playground。 - eggyal