RFC-0066:程序员建议的显式默认值 | |
---|---|
状态 | 已接受 |
区域 |
|
说明 | FIDL 规范未说明基元和枚举结构体字段是否具有默认值。此调整建议我们明确记录它们不存在。 |
作者 | |
提交日期(年-月-日) | 2018-07-20 |
审核日期(年-月-日) | 2019-01-14 |
摘要
FIDL 规范未说明基元和枚举结构体字段是否具有默认值。此调整建议我们明确记录它们不会。
设计初衷
在某些语言中,强制要求进行初始化很困难,在某些语言中则根本不可能。此提案为最低公分母留有余地,但为更高级别的语言提供了政策遵循。
由于对某些类型的结构体中的默认值不明确,因此存在一些分歧。语言绑定在处理隐式和显式默认值方面不一致。显然,可为 null 类型默认为 null,数组和矢量默认为空,但其他类型并非如此。C++ 绑定将基元类型默认为 false、0 或 0.0,但如果 FIDL 定义中未提供默认值,则 Dart 绑定要求在构造结构体时指定值。
零值通常是理想的默认值,但应明确声明。例如,如果 uint32_t
表示 FTP 编号,则 0 不是有效值,但 FIDL 无法表达调用方应指定编号。
设计
这主要是对文档进行澄清。它只是阐明了 FIDL 接口中表达的语义。它为改进绑定提供了机会,但并非强制要求。
FIDL 语言规范应包含以下信息(可能采用其他形式):
在绑定中实例化时,应指定结构体中没有在 FIDL 文件中声明的默认值的原始字段和枚举字段。如果宿主语言允许,并且这种行为是常见的并且符合程序员的预期,则绑定作者可以遵循默认值。例如,在 Dart 或 C++ 中,通常会使用默认值。不过,在 Go 中,结构体默认会被初始化,提供标准初始化的惯用模式是提供 NewMyStruct() 函数。在 C 中,不需要进行初始化,相反,程序员必须显式定义所有字段。不妨考虑使用宏。 如果绑定遵循默认值,则必须遵循提供的所有默认值,并且如果程序员未能初始化非默认字段,则必须报告错误。
文档和示例
语言规范和教程应更新为反映此更改。
向后兼容性
现有行为因不同的语言绑定而异。此更改允许所有现有行为,并鼓励用户日后采取更妥善的行为。
性能
无影响。
安全
这有助于阐明规范,并使意外滥用接口变得更加困难。这些做法有助于保障安全。
测试
无需进行测试。
缺点、替代方案和未知情况
另一种方法是正式定义:
struct Foo {
int32 bar;
bool baz;
float32 wux;
};
在语义上等同于:
struct Foo {
int32 bar = 0;
bool baz = false;
float32 wux = 0.0;
};
但正如上文所述,这可能无法捕获重要的语义。
此提案的先前迭代包含字符串,但在撰写本文时,它们仍然可为 null,因此需要提供一种方法来指明它们是必需的还是可选的。
在先技术和参考文档
不适用