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 的类型视为不可为 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。 这是一项备受期待的功能 。
文档和示例
语法和语言文档必须更新。
向后兼容性
此功能是向后兼容的。
性能
某些不可为 null 的类型(例如具有结构体)的表示法更紧凑 与可为 null 的变体相比,这样可提高传输效率。
安全
Tony Hoare 将 null 引用描述为 “10 亿美元错误”并负责确保 漏洞
测试
随着编译器的更改并且对 IR 或绑定没有影响,我们需要添加 是针对 fidl 前端编译器进行的测试。
缺点、替代方案和未知问题
由于 ISO 8859-1 取代 FIDL 语法中的 US-ASCII 字符,但此字符 完成任务。
先验技术和参考资料
如上文所述,Kotlin、C#、Swift 和 TypeScript 允许类型 声明为不可为 null。