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

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

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,因此有一种方法可以指明它们是必需的还是可选的。

在先技术和参考文档

不适用