RFC-0042:不可为 null 的类型 | |
---|---|
状态 | 已拒绝 |
领域 |
|
说明 | FIDL 库的作者可以使用 ? 将某些类型和成员标记为可为 null。这就提供了一种将类型和成员标记为不可为 null 的方法。 |
作者 | |
提交日期(年-月-日) | 2019-04-01 |
审核日期(年-月-日) | 2019-04-01 |
遭拒的理由
不过,在布局支持可为 null 的上下文(例如表格字段、可为 null 的类型别名)中强制执行在线状态的基本思路是很可能会被纳入另一个 FTP 中。
总结
FIDL 库的作者可以使用 ?
将某些类型和成员标记为可为 null。这就提出了一种将类型和成员标记为不可为 null 的方法。
设计初衷
借助类型别名,库创建者可以将声明纳入类型是否可为 null,例如:
using MiddleName = string:255?;
将可为 null 的类型明确标记为“不可为 null”可能很有用,例如:
struct FullName {
GivenName given_name;
vector<MiddleName> middle_names; // names shouldn't be null
FamilyName family_name;
}
另一个示例是外放的“boxed”类型:
// An "out-of-line" full name
struct InappropriateFullName {
option<FullName> full_name; // full_name shouldn't be null
};
设计
此方案针对会将可为 null 的类型标记为“不可为 null”的类型,引入了不可为 null 说明符。它是对源语言的更改,但不是传输格式、IR 或绑定的更改。
在上述情况下,我们将使用:
struct FullName {
GivenName given_name;
vector<MiddleName¿> middle_names;
FamilyName family_name;
}
且:
struct InappropriateFullName {
option<FullName¿> full_name;
};
为了与可为 null 性的语法对称,使用反转的问号符号。
这是 Unicode 代码点 \u00BF
,可在任何键盘上轻松输入。
可能的其他用例包括添加不可为 null 的 table
成员:
table FullName {
GivenName¿ given_name;
MiddleName middle-name;
FamilyName¿ family_name;
};
或者指定某个 xunion
成员必须始终存在:
xunion PreferredOperatingSystemVersion {
float32 Windows;
float32 MacOS;
float32 Linux;
float32¿ Fuchsia;
};
实施策略
这不是一项重大变更,但随着对 FIDL 中通用类型别名的新支持,最近对此项变更的需求有所增加。
工效学设计
不可为 null 类型是 Kotlin、C#、Swift 和 TypeScript 等语言的热门功能。对于 Dart 来说,这是呼声最高的功能。
文档和示例
您需要更新语法和语言文档。
向后兼容性
此功能是向后兼容的。
性能
与可为 null 的变体相比,某些不可为 null 的类型(例如具有结构体)的表示法比其可为 null 的变体更紧凑,因此可以实现更高效的传输。
安全性
Tony Hoare 将 null 引用描述为“价值数十亿美元的错误”,是导致安全漏洞的原因。
测试
由于编译器的更改不会影响 IR 或绑定,我们需要添加针对 fidl 前端编译器的测试。
缺点、替代方案和未知情况
有人担心采用 ISO 8859-1 会代替 FIDL 语法中的 US-ASCII 字符,但此字符可以完成这项工作。
早期技术和参考资料
如上所述,Kotlin、C#、Swift 和 TypeScript 都允许将类型声明为不可为 null。