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