当前位置: 首页 > news >正文

检索标准的网站网站系统 深圳博域通讯

检索标准的网站,网站系统 深圳博域通讯,江西做网站优化好的,水务 网站建设内部可变性#xff08;interior mutability#xff09;是RUST的设计模式之一#xff0c;它允许你在只持有不可变引用的前提下对数据进行修改。为了能改变数据#xff0c;内部可变性模式在它的数据结构中使用了unsafe#xff08;不安全#xff09;代码来绕过RUST正常的可变…内部可变性interior mutability是RUST的设计模式之一它允许你在只持有不可变引用的前提下对数据进行修改。为了能改变数据内部可变性模式在它的数据结构中使用了unsafe不安全代码来绕过RUST正常的可变性和借用规则。 假如我们能够保证自己的代码在运行时符合借用规则那么即使编译器无法在编译阶段保证符合借用规则也能使用那些采用了内部可变性模式的类型。 对于一般引用和BoxT的代码RUST会在编译阶段强制代码遵守借用规则。而对于RefCellT的代码RUST则只会在运行时检查这些规则并在违反借用规则的情况下触发panic来终止程序。 与RcT相似RefCellT只能被用于单线程场景中。强行将它用于多线程环境中会产生编译时错误。下面是选择使用BoxT、RcT和RefCellT的依据 RcT允许一份数据有多个所有者而BoxT和RefCellT都只有一个所有者BoxT允许在编译时检查可变或不可变借用RcT仅允许编译时检查不可变借用RefCellT允许运行时检查可变或不可变借用。由于RefCellT允许我们在运行时检查可变借用所以即使RefCellT本身是不可变的我们仍然能够更改其中存储的值。 pub trait Messager {fn send(self, msg: str); }pub struct LimitTrackera, T: a Messager {messager: a T,value: usize, }impla, T LimitTrackera, T whereT: Messager, {pub fn new(messager: T, value: usize) - LimitTrackerT {LimitTracker {messager: messager,value: value,}}pub fn set_value(mut self, value: usize) {self.value value;self.messager.send(msg);} }这段代码的重点是Messager trait它唯一的send方法可以接受self的不可变引用及一条文本消息作为参数。 示例的结构体同时使用生命周期标注和泛型约束结构体实现关联函数new和方法set_value。紧跟impl后的尖括号声明指明结构体自身的约束。 下面对set_value做单元测试mock一个实现了Message trait的结构体MockMessage进行验证调用send方法会向结构体字段中写入值。 #[cfg(test)] mod test {use super::*;struct MockMessage {sent_message: VecString,}impl MockMessage {fn new() - MockMessage {MockMessage {sent_message: vec![],}}}impl Messager for MockMessage {fn send(self, msg: str) {self.sent_message.push(String::from(msg));}}#[test]fn send_warning_message() {let mock_messager MockMessage::new();let mut limit_tracker LimitTracker::new(mock_messager, 2);limit_tracker.set_value(10);} }编译器报错send方法接收的self属于不可变引用我们无法修改MockMessage中的内容。如果将send方法self修改为mut self又不符合Messager trait约束。 在保持外部值不可变的前提下使用RefCellT来修改内部存储的值。sent_message字段类型调整成RefCellVecString最后调整成下面这个样子 #[cfg(test)] mod test {use super::*;use std::cell::RefCell;struct MockMessage {sent_message: RefCellVecString,}impl MockMessage {fn new() - MockMessage {MockMessage {sent_message: RefCell::new(vec![]),}}}impl Messager for MockMessage {fn send(self, msg: str) {self.sent_message.borrow_mut().push(String::from(msg));}}#[test]fn send_warning_message() {let mock_messager MockMessage::new();let mut limit_tracker LimitTracker::new(mock_messager, 2);limit_tracker.set_value(10);} }我们调用RefCellVecString类型的borrow_mut方法来获取内部值的可变引用接着我们便可以在动态数据的可变引用上调用push方法来存入数据。 我们会在创建不可变引用和可变引用时分别使用语法和mut。RefCellT实现了borrow和borrow_mut方法分别返回RefT与RefMutT这两种智能指针。由于这两种指针都实现了Deref所以我们可以把它们当做一般的引用来对待。 RefCellT会记录当前存在多少个活跃的RefT和RefMutT智能指针在任何一个给定的时间里它只允许你拥有多个不可变借用和一个可变借用。当我们违背借用规则时相比于一般引用导致的编译错误RefCellT会在运行时触发panic。
http://www.hkea.cn/news/14466150/

相关文章:

  • 上海网站改版服务网上哪个网站做的系统好用
  • 做点击率的网站上海建设牌电动三轮官方网站
  • 宁波做网站排名的公司有哪些建个普通网站多少钱
  • 自助建网站教程自己设计家装的app
  • 品牌网站建设新闻wordpress 绝对路径
  • 嘉兴网站建设技术托管长沙做网站推广哪家好
  • js 取网站域名网站的惩罚期要怎么做
  • 网站建设是干什么公司网站用什么语言开发
  • 网站目录扫描如何制作自己的微信公众号
  • 用哪个网站做首页比较好河北seo网络优化培训
  • 宝安网站建设网上怎么卖东西
  • 建设银行网站查询房贷信息洛宁网站开发
  • 免费弄空间的网站云筑网
  • 网站系统升级维护需要多长时间个人微信管理系统
  • 电脑网站怎么做的oa系统办公平台
  • 河北提供网站建设公司电话上海建企业网站
  • 优惠劵精选网站怎么做域名邮箱免费注册
  • 泊头网站建设服务企业服务官网模板
  • 长沙企业建站招聘信息电子商务网站建设规划书
  • 网站是如何设计配置方案的哈密网站制作公司
  • 济南饰品行业网站开发网站开发及设计
  • 可以做反链的网站wordpress edu v2.0
  • 广州网站设计公司济南兴田德润o评价h5制作网站公司
  • 网站建设福州最好免费获客平台
  • 微分销商城网站建设现货交易平台有哪些
  • 网站图片设置软件wordpress安装地址修改
  • 泰州专业做网站公司东菀高端网站建设
  • 自建站系统成都软件开发外包公司有哪些
  • 网站建设 空间什么系统160mk2成色
  • 网站上传ftp怎么在百度上发布广告