同步操作将从 deepinwiki/wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
rust是最新的一个比较流行的系统开发语言,和c/c++一样是一个比较底层的编程语言。但是rust 的优势在于它有现代语言具备的高级抽象表达能力。
从技术讲, rust 比 c 带来了一个更多的抽象,相对 c++ 引入了零成本抽象的改进,从语言层面添加了一个新的概念,那就是所谓的“所有权和借用”。这导致了 rust 具备更陡峭的学习成本。
总的而言, rust 更加安全,能帮助程序员养成编写安全可靠代码的习惯,同时保持底层语言需要的高性能。
Box<T>
Rc<T>
RefCell<T>
Mutex<T>
for<'a> F:Fn(&'a a)->&'a b
和包含它的主体的生命周期无关,而是和自身参数 a 有关。所有权(ownership): 一个对象严格对应一个变量,赋值会移动所有权,即新变量取得该对象,而旧变量失去所有权,变为不可用状态。
生命周期:生命周期在很多语言中都有涉及。也就是一个对象从创建到死亡的过程。当拥有对象的变量离开上下文范围,对象可以自动的释放对象。这类似c++的析构机制。不过rust比c++有更加精细的定义的操控,这个也是rust的一个难点。
共享对象:所有权的副作用导致对象共享变得不可能,但是我们现实编程中又经常需要共享对象,怎么办?rust 在这个层面引入很多概念来解决这个问题,但是也带来非常多的复杂性。因此,这也是rust的一个难点。
只读共享对象: 如果一个对象是只读的,那么共享它实际上非常安全。rust 引入了“借用”这个概念,类似很多其他语言中的“引用”。使用借用()这个词,更能明确“所有权”和“借用”的区别。
可写共享对象: 如果一个对象可写,这会很麻烦。状态不一致导致很多程序bug,这也是c/c++这类语言不安全的重要原因,如何保证可靠的可写共享,这就要严格的控制相关的程序逻辑(即语义),而程序逻辑有各种可能性。有几种策略:1. 克隆,产生一份镜像,回到简单的所有权概念(非共享),之后再想办法回写。2.可写借用。同样是借用,但是可写,不过这个可写借用本质也是非共享的,因为只能存在一份唯一的可写借用,某种层度上也是类似普通的所有权,差别是所有权转移会导致生命周期中的范围发生改变,而可写借用不会。3. 内部可写。rust支持不安全上下文,通过内部的不安全上下文对对象状态进行修改,这中技术叫内部可写。以上可见,可写共享对象的安全性是严格和程序逻辑相关的,rust并不支持自动的安全的可写共享对象,但是有相关的技术让其变得易于编写(也许)。
跨线程共享对象:这个问题在多线程下表现得更加明显。和其他语言类似,rust 也支持async和await的组合。在 rust 中,它的实现方法是通过一个Future
“特征”(类似其他语言中的接口),包含一个函数 poll(self:Pin<&mut Self>, cx:&mut Context<'_>)->Poll<Self::Output>
。其中self
参数标识调用者的类型,即Pin<&mut Self>
。这个泛型类型包含一个&mut Self
的参数,意思是自身类型的可写借用。cx
参数实际功能是包含数据的回调函数。返回值是Poll
枚举(类似c++加强版的联合),包含两种状态,一种是有Self::Output
类型的返回值,一种是等待。从这个原型可以看出跨线程的共享对象,使用的是精心设计的数据结构,其核心就是可写借用。
跨线程的数据安全:首先,基于所有权的对象传递(send)是安全的。因为它同时将所有权和生命周期范围跨线程了。而,借用就没那么幸运,因为不同的线程结束的次序是不确定的,如果被借用的对象先消亡,那么就违反了语义,存在bug。通过托管给智能指针的方式,让对象从一个线程中转移到智能指针中,由其负责管理,实现了借用语义。而这种智能指针就称之支持同步(sync)的。进而,支持可变借用的智能指针还包括了内部可写的特性,支持加锁和解锁,然而这种方式在其他语言中也有,且并不高明,容易出错,需要程序员精心设计。
内部可写和智能指针:所谓智能指针,就是模拟借用功能,但具备封闭api管理的对象。语言层面的借用功能是有限的,它是和特定程序逻辑无关的,而智能指针就弥补了这个缺点。库开发人员通过开发不同功能的智能指针,让借用功能得到扩展。内部可写通过利用不安全上下文,对rust语言限制的只读共享作出修改,让写入共享对象变得可能(但同时也失去了编译器安全分析的保护)。从技术上来说,他们是以智能指针的方式来实现。
总结rust核心概念涉及的具体对象:
let a : i32 = 5;
: i32类型的变量a,关联对象(值5),所有权转移语义。即 let b = a; b 获得对象(值5),a失去对象,且无效不可用。此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。