существовала. ненадежный

аюсь создать метод, который возвращает итератор над значениями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 или есть лучший способ?

Ответы на вопрос(1)

Ваш ответ на вопрос