¿Cómo devuelvo un iterador que tiene una referencia a algo dentro de un RefCell?

Estoy tratando de crear un método que devuelva un iterador sobre los valores deHashMap que está encerrado dentro de unRefCell, pero tengo un error dondeRef devuelto porRefCell::borrow no vive lo suficiente como para que el método devuelva el iterador. Aquí está mi código:

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)
    }
}

Error de compilación:

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
   |

¿Cómo devuelvo una referencia a algo dentro de un RefCell sin romper la encapsulación? sugiere crear una guardia que encapsuleRef y proporciona una interfaz para acceder al valor subyacente, pero lo que necesito hacer es devolver un objeto iterador (Values<'a, K, V>) que ya encapsula una referencia simple a unHashMap.

Mi principal problema es que tengo una referencia rastreada en tiempo de ejecuciónRef<T> mientras que necesito una referencia simple para crear un iterador.Ref::map expone una referencia simple para el mapeo, pero requiere que la función del mapeador devuelva otra referencia que es imposible aquí. ¿Debo rehacer toda la funcionalidad del iterador para trabajar conRef ¿O hay un mejor camino?

Respuestas a la pregunta(1)

Su respuesta a la pregunta