【问题标题】:Borrowing the T in a Rc<RefCell<T>>在 Rc<RefCell<T>> 中借用 T
【发布时间】:2014-05-27 14:24:31
【问题描述】:

我正在尝试做这样的事情

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

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

【问题讨论】:

    标签: rust borrowing


    【解决方案1】:

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

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

    self 表示map() 采用选项按值,即消耗它。特别是它意味着将期权价值从之前的位置移出。但是你不能这样做,因为在你的代码中你通过引用获取self - 你不能从引用中移出,而这正是错误的含义。

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-13
      • 2023-01-20
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      相关资源
      最近更新 更多