RFC-0066:程序员咨询明确默认值 | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 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;
};
此提案的上一版本包含字符串,但 因此也应提供一种方式来表明 必需或可选。
先验技术和参考资料
不适用