[英]How to get `&mut T` of a Box<Rc<RefCell<T>>>?
我從 FFI 得到了一個Box<Rc<RefCell<T>>>
。 我怎樣才能得到&mut T
基於它?
我無法編譯它。 編譯器告訴我:
47 | 讓 mut r: &mut 服務器 = server.borrow_mut();
| ^^^^^^^^^^ 特征BorrowMut<Server>
沒有為Box<Rc<RefCell<Server>>>
實現
|
= 幫助:為Box<T, A>
實現了特征BorrowMut<T>
>
有關此錯誤的更多信息,請嘗試rustc --explain E0277
。
#[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) };
let mut r: &mut Server = server.borrow_mut();
r.change_id();
return 0;
}
Auto-deref 將使borrow_mut()
可以直接訪問。
use std::{cell::RefCell, cell::RefMut, ops::DerefMut, rc::Rc};
fn main() {
let a = Box::new(Rc::new(RefCell::new("aaa".to_owned())));
//
println!("{:?}", a);
{
let mut r: RefMut<String> = a.borrow_mut();
r.push_str("bbb"); // via RefMut
let r2: &mut String = r.deref_mut();
r2.push_str("ccc"); // via exclusive-reference
}
println!("{:?}", a);
}
/*
RefCell { value: "aaa" }
RefCell { value: "aaabbbccc" }
*/
在您的代碼中, let mut r = server.borrow_mut();
應該足以調用r.change_id()
。
let mut r = server.borrow_mut();
r.change_id();
如果您絕對想要&mut
,請使用let r2 = r.deref_mut()
並調用r2.change_id()
。
let mut r = server.borrow_mut();
let r2 = r.deref_mut();
r2.change_id();
T 被包裹在RefCell<T>
中,必須實現Deref
或DerefMut
特征才能被可變借用或引用借用。 在您的情況下, Server 必須實現deref
方法。
use std::ops::DerefMut;
impl DerefMut for Server {
fn deref_mut(&mut self) -> &mut Self {
*self // this assumes your server has more than just one i32 field.
}
}
在此實現之后,您應該能夠調用server.borrow_mut()
應該可以正常工作並返回一個可變服務器 object。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.