существовала. ненадежный
аюсь создать метод, который возвращает итератор над значениямиHashMap
который помещен в коробку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>
) который уже включает в себя простую ссылку наHashMap
.
Моя главная проблема в том, что у меня есть ссылка, отслеживаемая во время выполненияRef<T>
в то время как мне нужна простая ссылка для создания итератора.Ref::map
предоставляет простую ссылку для отображения, но она требует, чтобы функция mapper возвращала другую ссылку, что здесь невозможно Должен ли я переделать всю функциональность итератора для работы сRef
или есть лучший способ?