RFC-0066:程序员建议显式默认值

RFC-0066:程序员公告显式默认设置
状态已接受
领域
  • FIDL
说明

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,因此请采用某种方式指明它们是必需还是可选。

早期技术和参考资料

不适用