You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Box<Rc<RefCell<T>>>类型中获取&mut T可变引用?

解决Box<Rc<RefCell<T>>>获取&mut T引用的编译错误

错误原因

直接在Box<Rc<RefCell<Server>>>上调用borrow_mut()行不通。Box实现的BorrowMut trait仅针对其内部包裹的类型——也就是这里的Rc<RefCell<Server>>,而非Server本身。编译器找不到从Box<Rc<RefCell<Server>>>到Server的BorrowMut实现,因此报错。

正确写法

需要逐层访问内部的RefCell,再调用它的borrow_mut()方法:

#[derive(Debug)]
struct Server {
    id: i32,
}

impl Server {
    pub fn change_id(&mut self) {
        self.id = self.id + 1;
    }
}

#[no_mangle]
pub extern "C" fn server_change_id(server: *mut Rc<RefCell<Server>>) -> isize {
    let server: Box<Rc<RefCell<Server>>> = unsafe { Box::from_raw(server) };
    // 先获取Box内部Rc的引用,再访问RefCell并调用borrow_mut
    let mut r = server.as_ref().borrow_mut();
    r.change_id();

    // 注意:如果FFI侧还需要复用该server指针,不要让Box自动释放内存
    // 可改用:let server = unsafe { &*server }; 仅获取引用不接管所有权
    // 或用Box::leak(server)将内存交还给C侧管理

    return 0;
}

关键步骤拆解

  • server.as_ref():获取Box内部Rc<RefCell<Server>>的共享引用,避免直接消耗Box(如果不需要立即释放内存的话)
  • .borrow_mut():调用RefCell的方法返回RefMut<Server>,它会自动解引用为&mut Server,可直接调用change_id()方法

内容的提问来源于stack exchange,提问作者progquester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:33:20