交易平台网站建设项目需求,回龙观做网站,wordpress widgets,qplayer wordpressrust引用-借用机制还是有限制的#xff0c;比如我们要在多次函数调用中修改参数、跨线程传递参数并发修改的场景#xff0c;单纯使用引用-借用机制就不灵了#xff08;这种场景和引用-借用功能是冲突的#xff09;。这时需要借助rust提供的Rc、Arc、Cell、RefCell对机制来扩… rust引用-借用机制还是有限制的比如我们要在多次函数调用中修改参数、跨线程传递参数并发修改的场景单纯使用引用-借用机制就不灵了这种场景和引用-借用功能是冲突的。这时需要借助rust提供的Rc、Arc、Cell、RefCell对机制来扩展默认的引用借用机制。 慢慢品味std库里提供的很多实现都是围绕引用-借用机制展开的默认的引用-借用机制适合80%的场景20%的场景还是需要额外的机制来扩展的可能其中的15%可以通过优化设计来解决。
use std::rc::Rc;
use std::cell::RefCell;fn main() {println!(Hello, world!);let mut param Param::default();param.name xiao ming.to_string();let rc_param Rc::new(param);//Rc自带引用计数可clone多个传给给函数作为参数超出作用域引用计数减一至零是自动销毁//Rc不能跨线程要跨线程使用需要改为ArcMutexlet rc1 rc_param.clone();let rc2 rc_param.clone();let rc3 rc_param.clone();println!({}, rc1.name);new_value_fn1(rc2);new_value_fn2(rc3);//如果要在函数中修改参数的值需要使用RcRecCelllet mut param2 Param::default();param2.name 小红.to_string();let rc_refcell_param Rc::new(RefCell::new(param2));let rc_rec_p1 rc_refcell_param.clone();let rc_rec_p2 rc_refcell_param.clone();new_value_refcell_fn1(rc_rec_p1);new_value_refcell_fn2(rc_rec_p2);println!({}, rc_refcell_param.borrow().name); //小红-fn1-fn2
}fn new_value_fn1(param: RcParam){println!(from fn1: {}, param.name);//不让修改这能引用//param.is_valid false;
}
fn new_value_fn2(param: RcParam){println!(from fn2: {}, param.name);
}fn new_value_refcell_fn1(param: RcRefCellParam){let mut p param.borrow_mut();let new_name p.name.clone() -fn1;p.name new_name;p.is_valid true;
}fn new_value_refcell_fn2(param: RcRefCellParam){let mut p param.borrow_mut();let new_name p.name.clone() -fn2;p.name new_name;
}struct Param{name: String,age: i32,is_valid: bool,
}impl Default for Param{fn default () - Self{Self{name: .to_string(),age: 20,is_valid: true,}}
}