簡體   English   中英

如何獲得一個盒子的`&amp;mut T` <rc<refcell<t> &gt;&gt;? </rc<refcell<t>

[英]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>中,必須實現DerefDerefMut特征才能被可變借用或引用借用。 在您的情況下, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM