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

RFC-0066:程序员咨询明确默认值
状态已接受
领域
  • FIDL
说明

FIDL 规范未说明基元和枚举结构体字段是否具有默认值。这种调整提议我们明确记录它们并非如此。

作者
提交日期(年-月-日)2018-07-20
审核日期(年-月-日)2019-01-14

摘要

FIDL 规范未说明基元结构体和枚举结构体 字段具有默认值。 这种调整提议我们明确记录它们并非如此。

设计初衷

对于某些语言,要求初始化颇具挑战性,而且是不可能的 。 此方案让最低标准有了大门,但 用于提供政策,供更高阶语言遵循。

对于某些类型,结构体中的默认值不明确 存在一些分歧。 语言绑定在处理隐式和显式时不一致 默认值。 很明显,可为 null 的类型默认为 null,而数组和矢量则默认为 null 为空,但不为空。 C++ 绑定默认基元类型为 false、0 或 0.0,但 Dart 如果没有关联,绑定要求在构造结构体时指定值, FIDL 定义中提供了默认值。

通常,零值是非常合适的默认值,但应明确声明它们。 例如,如果 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;
};

但如上所述,可能无法捕获重要的语义。

此提案的上一版本包含字符串,但 因此也应提供一种方式来表明 必需或可选。

先验技术和参考资料

不适用