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

在先技术和参考资料

不适用