使覆盖成为可选加入 #疯狂想法 ⋅ 渐进式步骤

主要观点:提出通过引入Overwrite特质来减少 Rust 中的互过程借用检查错误,增加代码的清晰度,使Pin操作更简单。具体内容如下:

  • TL;DR:若限制对&mut引用的可覆盖性,可减少借用检查错误,增加清晰度,简化Pin操作。大多数结构体和枚举默认实现Overwrite,未来版本可改为默认不实现,需显式声明T: Overwrite边界。
  • 结构系列:此博客是一个系列的一部分,包括介绍不可变字段的理念、深入探讨PinOverwrite特质的关系等。
  • 若能改变 Rust 的一件事:认为当前 Rust 中给定x: &mut SomeStruct可直接覆盖整个值,这使借用和固定操作更复杂,提出用特质替代新的引用类型来解决。
  • 动机示例 1:不可变字段:Rust 中局部变量默认不可变,字段的可变性从外部继承。若将字段声明为mut,则只有在结构体出现在可变位置且字段声明为mut时才能修改。但仅声明字段为mut不够,因为字段可间接修改。例如Analyzer结构体,data字段不可变,important字段可变。在increment_if_important方法中,由于存在共享借用,当前 Rust 代码无法编译。
  • 回顾:区分字段的可变与不可变可消除许多函数间的借用检查错误,但仅添加mut声明不够,因为字段可间接修改,且通用代码如std::mem::swap会导致问题。
  • 特质系统来解决:引入Overwrite特质,作为标记特质表示类型可被覆盖。Overwrite要求Sized,仅适用于借用值,不是感染性的,某些类型默认实现Overwrite,如Copy类型、指针类型,而dyn[]等无静态大小的类型不实现。结构体和枚举在 Rust 2021 中默认实现Overwrite,未来版本可改为默认不实现。默认边界相关问题需考虑,关联类型边界较麻烦但可通过关联类型别名解决。
  • 常见问题:回顾主要内容,解释此更改不仅为获取不可变字段,后续将展示如何消除Pin的使用痛点,以及OverwriteUnpin的关系等。
    结论:通过引入Overwrite特质等方式可改善 Rust 代码的一些问题,希望后续不会因明显缺陷而撤回该想法。
阅读 9
0 条评论