Maximally minimal view types
概述
本文描述了一个最大化最小化的view types提议,源自RustNation上与lcnr和Jack Huey的讨论。这是一个关于改进Rust语言的"处于迷雾中"的想法,基本上所有人都想做,但需要克服一些障碍。
核心问题: borrow checker不知道一个方法只会访问struct的某些字段。当你对self.messages调用drain时,同时调用self.process_message,编译器会认为两者冲突,因为不知道process_message只访问statistics字段。
示例:MessageProcessor
pub struct MessageProcessor {
messages: Vec<String>,
statistics: Statistics,
}
基本工作流程:
- 通过push将消息累积到self.messages
- drain累积的消息并处理它们
- 重用底层buffer来push未来的消息
View Types语法
View types的基本思想是扩展struct类型语法,可选地包含可访问字段列表:
RustType := StructName<...> { field1, field2, ... }
例如,MessageProcessor { statistics }表示"一个只可以访问statistics字段的MessageProcessor结构体"。
关键特性
- 隐私尊重: view types遵守隐私规则,只能在可以访问字段的上下文中使用
- 运行时只是指针: view types是纯静态构造,不改变编译方式
- Borrow checker集成: 对于view borrow,记录多个loan而不是单一loan
实现难度
作者认为实现难度不大,"如果我们找到一个想要承担的贡献者,今年就可以发货"。
FAQ
必须显式指定字段吗?
当前设计需要显式写&mut place {field1, field2}。未来可能引入行类型多态性(row polymorphism)来推断。
语法歧义
存在一些语法歧义问题,比如&mut some_variable { messages }可能被解析为struct表达式或borrow。需要进一步解决。
结论
这是一个好的MVP,值得发货。这是对Rust语言的一个重要潜在改进,解决了长期以来的borrow checker限制问题。