Rust Entry::Occessed.get()返回一个值,该值引用当前函数拥有的数据,即使hashmap应该拥有所有权

Rust Entry::Occessed.get()返回一个值,该值引用当前函数拥有的数据,即使hashmap应该拥有所有权,rust,ownership,Rust,Ownership,我的目标是在rust book第13.1章的cacher结构上实现建议的改进,即创建一个结构,该结构接受一个函数并使用memonization来减少给定函数的调用次数。为此,我创建了一个带有HashMap的结构 请注意,有必要暂时保存结果,因为insert方法使用该键,并且这样的argRef不再有效。我也承认值的签名可能有问题(请参阅),但我试图避免复制特性绑定 为了快速再现问题,我附加了必要的use语句。谢谢你的帮助 use std::collections::HashMap; use std

我的目标是在rust book第13.1章的cacher结构上实现建议的改进,即创建一个结构,该结构接受一个函数并使用memonization来减少给定函数的调用次数。为此,我创建了一个带有HashMap的结构

请注意,有必要暂时保存结果,因为insert方法使用该键,并且这样的argRef不再有效。我也承认值的签名可能有问题(请参阅),但我试图避免复制特性绑定

为了快速再现问题,我附加了必要的use语句。谢谢你的帮助

use std::collections::HashMap;
use std::cmp::Eq;
use std::hash::Hash;
use std::collections::hash_map::{OccupiedEntry, VacantEntry, Entry};
让我们来看看我们的签名:

 pub fn get(&self) -> &V
这个签名告诉我们的是,从
占用数据库
中获得的引用只能与
占用数据库
本身一样有效。但是,
OccupiedEntry
是一个局部变量,因此在函数返回时会删除它

我们需要的是一个引用,其生存期绑定到
HashMap
的生存期。和都有一个生存期参数(
'a
),该参数链接到中的
&mut self
参数。我们需要一个在
OccupiedEntry
上返回
和'av
的方法。没有这样的方法,但是有一个方法返回一个
”&一个mut V
:。可变引用可以隐式地强制为共享引用,因此我们需要做的就是将
get()
替换为
,将其转换为\u mut()

let result = (self.calculation)(argRef);
vacEntry.insert(result)
use std::collections::HashMap;
use std::cmp::Eq;
use std::hash::Hash;
use std::collections::hash_map::{OccupiedEntry, VacantEntry, Entry};
 pub fn get(&self) -> &V
fn value(&mut self, arg: U) -> &V {
    match self.map.entry(arg) {
        Entry::Occupied(occ_entry) => occ_entry.into_mut(),
        Entry::Vacant(vac_entry) => {
            let arg_ref = vac_entry.key();
            let result = (self.calculation)(arg_ref);
            vac_entry.insert(result)
        }
    }
}