rust Cell 與 RefCell 的區別

大家好,我是螃蟹哥。

今天給大家分享 Rust 中 Cell 於 RefCell 的異同。

Cell 與 RefCell 的相同點

繞開所有權的限制,實現內部可變性性

rust 的所有權規則:

fn modify(a: &mut i32) {
    *x = *x + 1;
}

fn main() {
    let a =  111;
    modify(&mut a);
    
}

變量 a 定義成一個不可變的變量,不能用於 modify 函數中,如果知道 rust 所有權規則,你一定會說直接改成let mut a = 111;就完事了; 當存在即合理,有些場景是需要允許對一個不可變變量進行修改的,這需要就需要 Cell 和 RefCell 出場了。

Cell 主要是一些 setter 和 getter 的方法,比如 set,get,replace,take, 但是呢,get 的方法需要變量實現 Copy trait,比如 String 類型沒有實現 Copy trait, 那麼Cell::new(String::from("Hello")).get()會報錯,提示說沒有實現 Copy trait。

而 replace,set,take 則適用於 String 這種沒有實現 Copy trait 的類型。一般來說,Cell 內部實現會發生內存的分配,性能較之 RefCell 有點大。

RefCell 提供了 borrow_mut 和 borrow,調用這兩個方法時,rust 的運行時會檢查所有權,比如 borrow_mut 調用時,類型已經存在了可變引用了,則會直接發生線程 panic,因此提供了返回錯誤的版本:try_borrow_mut 和 try_borrow

總結一下

兩者的共同點是爲了突破可變引用和引用不能共存的問題,不同點是:

  1. Cell 是操作 T(values), RefCell 操作 & T(references)

  2. Cell 在編譯器檢查,運行時不會 panic;RefCell 在運行時檢查,使用不當會發生 panic


希望你對兩者有了一個更深的理解。

原文鏈接:https://www.cnblogs.com/linyihai/p/15914361.html

作者:yihailin

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/PAKcYGmE6yIJS-mEuMlz0Q