从为什么我不能存储的值,并在相同的结构,以该值的参考?我了解到我无法在同一结构中存储值和引用。
提议的解决方案是:
最简单,最推荐的解决方案是不要尝试将这些项目放在同一结构中。这样,您的结构嵌套将模仿代码的生命周期。将拥有数据的类型放到一个结构中,然后提供一些方法,使您可以根据需要获取引用或包含引用的对象。
但是,我不知道如何在我的具体情况下应用此方法:
我想构建双向地图,由两个内部HashMap
s实现。显然,其中之一必须拥有数据。但是,另一部分对于双向地图也是必不可少的,因此我看不到如何在保持双向地图接口的同时将两者分开。
struct BidiMap<'a, S: 'a, T: 'a> { ? }
fn put(&mut self, s: S, t: T) -> ()
fn get(&self, s: &S) -> T
fn get_reverse(&self, t: &T) -> S
在这种情况下,最简单的解决方案是像使用垃圾收集器的语言一样工作:
use std::collections::HashMap;
use std::rc::Rc;
use std::hash::Hash;
use std::ops::Deref;
struct BidiMap<A, B> {
left_to_right: HashMap<Rc<A>, Rc<B>>,
right_to_left: HashMap<Rc<B>, Rc<A>>,
}
impl<A, B> BidiMap<A, B>
where
A: Eq + Hash,
B: Eq + Hash,
{
fn new() -> Self {
BidiMap {
left_to_right: HashMap::new(),
right_to_left: HashMap::new(),
}
}
fn put(&mut self, a: A, b: B) {
let a = Rc::new(a);
let b = Rc::new(b);
self.left_to_right.insert(a.clone(), b.clone());
self.right_to_left.insert(b, a);
}
fn get(&self, a: &A) -> Option<&B> {
self.left_to_right.get(a).map(Deref::deref)
}
fn get_reverse(&self, b: &B) -> Option<&A> {
self.right_to_left.get(b).map(Deref::deref)
}
}
fn main() {
let mut map = BidiMap::new();
map.put(1, 2);
println!("{:?}", map.get(&1));
println!("{:?}", map.get_reverse(&2));
}
当然,你想有多少更严格的代码,因为这可以让你打破双向映射。这只是向您显示解决问题的一种方法。
显然,其中之一必须拥有数据
显然,这不是正确的^ _ ^。在这种情况下,两个地图都使用共享所有权Rc
。
对这个解决方案进行基准测试,以了解它是否足够有效。
做任何更有效的事情都需要对所有权进行更多的思考。例如,如果left_to_right
地图拥有数据,而您在另一个地图中使用了原始指针,则在重新分配第一个地图后,该指针将失效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句