我正在尝试创建一个方法,该方法返回一个迭代器,该迭代器的值HashMap
被装箱在 a 内RefCell
,但是我遇到了一个错误,即Ref
返回的RefCell::borrow
时间不够长,无法从方法返回迭代器。这是我的代码:
use std::rc::Rc;
use std::cell::RefCell;
use std::collections::HashMap;
use std::collections::hash_map::Values;
struct Foo {
map: Rc<RefCell<HashMap<i32, i32>>>,
}
impl Foo {
fn iter(&self) -> Values<i32, i32> {
self.map.borrow().values()
}
}
fn main() {
let foo = Foo {
map: Rc::new(RefCell::new(HashMap::new()))
};
for v in foo.iter() {
println!("{}", v)
}
}
编译错误:
rustc 1.15.1 (021bd294c 2017-02-08)
error: borrowed value does not live long enough
--> <anon>:12:9
|
12 | self.map.borrow().values()
| ^^^^^^^^^^^^^^^^^ does not live long enough
13 | }
| - temporary value only lives until here
|
如何在不破坏封装的情况下返回对 RefCell 内某些内容的引用?建议创建一个守卫,它封装Ref
并提供一个用于访问底层值的接口,但我需要做的是返回一个Values<'a, K, V>
已经封装了对 a 的普通引用的迭代器对象 () HashMap
。
我的主要问题是我有一个运行时跟踪引用Ref<T>
,而我需要一个普通引用来创建迭代器。Ref::map
公开了一个简单的映射引用,但它要求映射器函数返回另一个引用,这在此处是不可能的。我应该重做整个迭代器功能以使用Ref
还是有更好的方法?