RFC-0039:类型位于第二位 | |
---|---|
状态 | 已拒绝 |
区域 |
|
说明 | 我们提议允许内嵌声明结构体、xunion 和表;将字段名称(或参数和返回名称)与类型的显示顺序颠倒过来,具体而言,将类型显示在名称后面。 |
作者 | |
提交日期(年-月-日) | 2019-03-07 |
“You're Go-ing to love it”
拒绝理由
在起草和共享此提案时,我们达成了一致共识,即一次性考虑语法更改,而不是一次更改一个(另请参阅 RFC-0038)。我们还希望由一个人来决定语法,而不是冒着由委员会设计的风险。
最终,此提案被 RFC-0050 取代,后者满足了所需的两个条件。
摘要
我们提议:
- 允许内嵌声明结构体、联合体和表;
- 将字段名称(或参数/返回名称)与类型的显示顺序颠倒过来,具体而言,使类型显示在名称后面。
(我们没有引入匿名声明,因为我们可能希望改进绑定支持,以确保良好的人体工学体验。)
设计初衷
快速:
- 我们开始发现越来越多的模式,其中组合使用各种声明来描述“一个概念消息”是常规做法。例如:
- 容器结构体,其最后一个字段是一个表(最初为空),以便为扩展程序留出余地。
- 容器联合,其中变体是表,以实现灵活性。
- 容器表,其中字段按结构体分组,而序数与“版本号”大致匹配。
- 此外,对空结构体、联合体和表的支持提供了构建代数数据类型支持的低级部分(从布局角度,而不是绑定角度)。
- 所有这些用例都促使我们允许内嵌声明。
- 使用内嵌声明时,您可以先读取字段名称,然后再读取类型说明(可以跨多行)。请参见下面的示例。
设计
请参见以下示例:
简单的结构体或表格:
struct Name { field int32; }; table Name { 1: field int32; };
协议:
protocol Name { Method(arg int32) -> (ret int32); };
带有扩展的结构体:
struct Name { field1 T1; field2 T2; ...; ext table NameExt {}; };
联合变体:
union Name { variant1 table NameVariant1 { ... }; variant2 table NameVariant2 { ... }; ... };
按版本对字段进行分组:
table Name { 1: v1 struct NameGroupV1 { ... }; 2: v2 struct NameGroupV2 { ... }; ... };
注意:
- 在作用域方面,虽然我们会将所有声明名称视为顶级名称(因此会按库强制执行唯一性),但我们不允许引用内嵌声明,即只能单次使用。
工效学设计
此提案通过语法向开发者传达 ABI 影响,从而改善了人体工学。
文档和示例
至少:
向后兼容性
这不向后兼容源代码级别。