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
總結一下
兩者的共同點是爲了突破可變引用和引用不能共存的問題,不同點是:
-
Cell 是操作 T(values), RefCell 操作 & T(references)
-
Cell 在編譯器檢查,運行時不會 panic;RefCell 在運行時檢查,使用不當會發生 panic
希望你對兩者有了一個更深的理解。
原文鏈接:https://www.cnblogs.com/linyihai/p/15914361.html
作者:yihailin
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/PAKcYGmE6yIJS-mEuMlz0Q