Rust 在生锈的情况下,我应该避免使用Rc和RefCell吗?

Rust 在生锈的情况下,我应该避免使用Rc和RefCell吗?,rust,Rust,Rust在编译时提供借阅检查。但是,如果使用Rc和RefCell,检查将在运行时延迟,并且当程序违反规则时将引发恐慌。就这样, 使用std::rc::rc; 使用std::cell::RefCell; fn func1(参考:Rc){ 设mut a=reference.borrow_mut(); *a=字符串::from(“func1”); func2(reference.clone()); } fn func2(参考号:Rc){ 设mut a=reference.borrow_mut(); *

Rust在编译时提供借阅检查。但是,如果使用
Rc
RefCell
,检查将在运行时延迟,并且当程序违反规则时将引发恐慌。就这样,

使用std::rc::rc;
使用std::cell::RefCell;
fn func1(参考:Rc){
设mut a=reference.borrow_mut();
*a=字符串::from(“func1”);
func2(reference.clone());
}
fn func2(参考号:Rc){
设mut a=reference.borrow_mut();
*a=字符串::from(“func2”);
func3(reference.clone());
}
fn func3(参考:Rc){
设mut a=reference.borrow_mut();
*a=字符串::from(“func3”);
}
fn main(){
设a=Rc::new(RefCell::new(String::from(“hello”));
func1(a.clone());
}

这段代码仍然将bug(可能不是bug)留给运行时处理,并处于恐慌状态。因此,我应该尽可能避免使用
Rc
RefCell
?这段代码算是安全代码吗?

因为
Rc
RefCell
允许您编译运行时可能会死机的代码,所以不能轻易使用它们。您可以使用
try\u borrow\u mut
而不是
borrow\u mut
来避免恐慌并自行处理结果

也就是说,即使您防止了所有的恐慌,
Rc
RefCell
在运行时也会有成本,因为它们保留了一个引用计数器。在许多情况下,您可以通过以一种更加生疏的方式重写代码来避免它们

fn func1(mut string:string)->string{
string=“func1.into();
func2(字符串)
}
fn func2(多字符串:字符串)->字符串{
string=“func2.into();
func3(字符串)
}
fn func3(字符串:字符串)->字符串{
“func3”。改为()
}
fn main(){
设a=func1(“hello.into());
}
更简单、更安全。Rust将为您进行优化


要回答上一个问题,使用
借用_mut
不被视为不安全代码,因为即使使用
#也可以编译代码![禁止(不安全的代码)]
指令

由于
Rc
RefCell
允许您编译运行时可能会死机的代码,因此不能轻率使用它们。您可以使用
try\u borrow\u mut
而不是
borrow\u mut
来避免恐慌并自行处理结果

也就是说,即使您防止了所有的恐慌,
Rc
RefCell
在运行时也会有成本,因为它们保留了一个引用计数器。在许多情况下,您可以通过以一种更加生疏的方式重写代码来避免它们

fn func1(mut string:string)->string{
string=“func1.into();
func2(字符串)
}
fn func2(多字符串:字符串)->字符串{
string=“func2.into();
func3(字符串)
}
fn func3(字符串:字符串)->字符串{
“func3”。改为()
}
fn main(){
设a=func1(“hello.into());
}
更简单、更安全。Rust将为您进行优化


要回答上一个问题,使用
借用_mut
不被视为不安全代码,因为即使使用
#也可以编译代码![禁止(不安全代码)]
指令取决于您的具体情况。有些事情仅仅使用引用和编译时借用是不容易的。指导原则是尝试用Rustacean编译时的方式来完成,如果太难,根据您的具体情况寻找运行时借用。有些事情仅仅使用引用和编译时借用是不容易的。指导原则是尝试用Rustacean编译时的方式来完成,如果太难,请寻找运行时借用