< 返回我的博客

ChaosBot 发表于 2018-05-08 15:36

Tags:rust

该文是对知乎相关问题的一个回答:Rust 里的 Box 指针被称作 affine type,请问 affine type 是什么?


提出问题的人看的是Rust Book第一版,客观来说,这本书内容组织上比较混乱。

就拿这个问题来说,这里提到Box是一种affine type,其实它应该在讲所有权的时候就应该先解释一下,但它并没有。

然后放到Box章节突然多了一个affine type,让人云里雾里。其实他想说的意思是:

**「Box是独占所有权的」 **

话说回来,affine type属于类型理论中子结构类型系统(Substructural Type Systems)的概念。子结构类型系统又是子结构逻辑(Substructural Logic)在类型系统的应用。而子结构逻辑是属于证明理论里的推理规则,其规则包含:

  • 线性逻辑(Linear Logic)
  • 仿射逻辑(Affine Logic)
  • 其他

子结构逻辑规则,用于推理。它的特点是不需要具体的逻辑符号,光靠结构来推理相关逻辑(大白话解释)。怎么理解?

  • 线性逻辑表示,如果某个变量符合某种特定的“结构”,它就内含一种规则:必须且只能使用一次。
  • 仿射逻辑和线性逻辑是类似的,但它的规则是,最多使用一次,也就是说,可以使用0次或1次。看上去线性逻辑更严格一些。

所以,对应用类型系统那就是:

  • 线性类型(Linear Type)
  • 仿射类型(Affine Type)

而Rust作为现代编程语言,主打内存安全,众所周知的就是它的所有权机制。它利用类型系统来完成这一目标。

来看一个示例:

fn main(){
    let a = Box::new("hello");
    let b = a;
    //    println!("{:?}", a);  // a 已经被move,这里无法再次使用
}

以上例子,变量a独占所有权,所以在let b = a执行完以后,a的所有权就会转移给b,再次使用变量a的话,就会报错。 利用仿射类型,Rust实现了所有权机制,在需要move的时候自动move,维护了内存安全。

我想这大概可以解释清楚了吧。

参考资料:

如果想研究子结构逻辑可以看这个(不知道你能不能看懂,我反正是看不懂):子结构逻辑pdf

评论区

写评论

还没有评论

1 共 0 条评论, 1 页