Rust提供了在编译时的借用检查。但如果使用Rc
和RefCell
,则检查将被推迟到运行时,并且当程序违反规则时会引发异常,就像这样:
use std::rc::Rc;
use std::cell::RefCell;
fn func1(reference: Rc<RefCell<String>>){
let mut a = reference.borrow_mut();
*a = String::from("func1");
func2(reference.clone());
}
fn func2(reference: Rc<RefCell<String>>){
let mut a = reference.borrow_mut();
*a = String::from("func2");
func3(reference.clone());
}
fn func3(reference: Rc<RefCell<String>>){
let mut a = reference.borrow_mut();
*a = String::from("func3");
}
fn main() {
let a = Rc::new(RefCell::new(String::from("hello")));
func1(a.clone());
}
这段代码仍然将缺陷(也许不是真正的缺陷)留给了运行时并且会导致程序崩溃。所以我应该尽量避免使用 Rc
和 RefCell
吗?这段代码算作安全代码吗?