Rust 中的 Pin, Unpin 和 !Unpin
为什么需要 Pin
?
引入 Pin
的目的主要是为了支持 自引用类型 (self-referential types) 。下面我们以
Future
为例,解释一下自引用类型以及引入 Pin
的必要性。
由于异步块/异步函数中可能包含对局部变量的引用,例如下面的代码:
Pin
?引入 Pin
的目的主要是为了支持 自引用类型 (self-referential types) 。下面我们以
Future
为例,解释一下自引用类型以及引入 Pin
的必要性。
由于异步块/异步函数中可能包含对局部变量的引用,例如下面的代码:
下面的例子中, borrow checker 会检查 r
的生命周期 'a
比其引用的数据的生命周期 'b
要长,因此会拒绝编译通过。
|
|
具体到形式层面,Lifetime 实际上是一种特殊的泛型参数,这些泛型参数为编译器提供了有关引用之间如何相互联系的信息。
Rust 的 move
和 C++ 的 std::move
在表面上看有些相似之处,因为它们都涉及到数据或资源的转移。然而,它们在设计理念、实现方式以及它们在各自语言中所扮演的角色上有着根本的区别。
std::move
,可以将一个对象的状态或资源转移到另一个对象,原对象则处于一个有效但未定义的状态。具体来讲,C++ 的 move 语义是通过类的『移动构造函数』和『移动赋值运算符』来提供支持的。
今天发布了我的第一个 crate: django-auth, 虽然是一个非常简单的 crate, 但麻雀虽小,五脏俱全,API 文档、测试用例、doc test 等一个都不能少 😎。
先简单介绍一下这个库,然后再介绍一下在 crates.io 上发布 crate 的流程。
trait 是 Rust 中用来定义共享行为的抽象机制,和 Java 的 interface, Swift 的 protocol 等接口抽象机制有点类似。
定义一个 trait 很简单:
|
|
为 Rust 的 str
类型实现该 trait (implements Callable
for str
):