如何从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
相关产品推荐
相关产品推荐

