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