| 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,因此有一种方法可以指明它们是必需的还是可选的。
在先技术和参考资料
不适用