RFC-0042:不可为 null 类型

RFC-0042:不可为 null 的类型
状态已拒绝
领域
  • FIDL
说明

FIDL 库作者可以使用 ? 将某些类型和成员标记为可为 null。它提供了一种将类型和成员标记为不可为 null 的方法。

作者
提交日期(年-月-日)2019-04-01
审核日期(年-月-日)2019-04-01

遭拒原因

Poisson d'avril

然而,在这种情境下强制执行呈现的根本理念是, 布局支持可为 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。