借用Rc中的T <refcell <t>&gt; </refcell <t>

时间:2014-05-27 14:24:31

标签: rust borrowing

我试图做这样的事情

use std::cell::{RefCell,Ref,RefMut};
use std::rc::Rc;

struct Entity;

struct Tile {
    entity: Option<Rc<RefCell<Entity>>>
}

impl Tile {
    pub fn try_read_entity<'a>(&'a self) -> Option<Ref<'a, Entity>> {
        self.entity.map(|e| e.borrow())
    }
}

我遇到了与生命相关的错误,并且发现很难理解究竟出了什么问题,或者是否有可能做到这一点。

1 个答案:

答案 0 :(得分:3)

这是Option::map()方法的签名:

fn map<U, F>(self, f: F) -> Option<U>
    where F: FnOnce(T) -> U

self表示map()选择选项,也就是说,它会消耗它。特别是它意味着将选项值从之前的位置移出。但是你不能这样做,因为在你的代码中你通过引用取self - 你不能从引用中移出,而这正是错误的意思。

但是,您不需要使用该选项,您只需要引用其包含的值。幸运的是,Option<T>提供了一种方法fn as_ref(&'a self) -> Option<&'a T>,可用于获取对选项内部的引用。如果您在调用map()之前调用它,则代码将起作用:

self.entity.as_ref().map(|e| e.borrow())