RFC-0042:不可為空值類型

RFC-0042:不可為空值的類型
狀態已遭拒
區域
  • FIDL
說明

FIDL 程式庫的作者可以使用 ? 將某些類型和成員標示為可為空值,提出將類型和成員標示為不可為空值的方法。

作者
提交日期 (年/月)2019-04-01
審查日期 (年/月)2019-04-01

拒絕原因

Poisson d'avril

不過,如果在版面配置支援是否可為空值的情況 (例如資料表欄位、可為空值的類型別名),這個基礎概念可能會納入其他 FTP 中。

摘要

FIDL 程式庫作者可以使用 ? 將部分類型和成員標示為「空值」。 這意味著將類型和成員標示為不可為空值的方法。

提振精神

透過類型別名,程式庫作者可將宣告納入類型中,例如:

using MiddleName = string:255?;

您可以將可為空值的類型明確標示為不可為空值,例如:

struct FullName {
  GivenName given_name;
  vector<MiddleName> middle_names; // names shouldn't be null
  FamilyName family_name;
}

另一個例子是,「黑邊」類型的位置不對於:

// An "out-of-line" full name
struct InappropriateFullName {
    option<FullName> full_name; // full_name shouldn't be null
};

設計

本提案導入不可為空值的類型指定詞,用於將可為空值的類型標示為不可為空值。只是變更來源語言,而不是傳輸格式、IR 或繫結。

在上述情況下,我們會使用:

struct FullName {
  GivenName given_name;
  vector<MiddleName¿> middle_names;
  FamilyName family_name;
}

且:

struct InappropriateFullName {
    option<FullName¿> full_name;
};

針對類型為「是否可為空值」語法的對稱,系統會使用反轉的問號符號。這是 Unicode 碼點 \u00BF,在任何鍵盤上都可輕鬆輸入

可能的其他用途是新增不可為空值的 table 成員:

table FullName {
  GivenName¿ given_name;
  MiddleName middle-name;
  FamilyName¿ family_name;
};

或是指定必須一律顯示特定的 xunion 成員:

xunion PreferredOperatingSystemVersion {
  float32 Windows;
  float32 MacOS;
  float32 Linux;
  float32¿ Fuchsia;
};

導入策略

這並非破壞性變更,但最近對於 FIDL 中的一般化類型別名的支援已增加,這一點已增加。

人體工學

不可為空值類型是 Kotlin、C#、Swift 和 TypeScript 等語言的熱門功能。Dart 是 眾所期盼的功能

說明文件與範例

文法和語言說明文件必須更新。

回溯相容性

這項功能與舊版相容。

效能

某些不可為空值的類型 (例如有結構體) 的表示法比其可為空值變數更精簡,因此能夠提高傳輸效率。

安全性

Tony Hoare 指出空值參照是「數十億美元錯誤」,可能會導致安全漏洞。

測試

由於編譯器的變更不會影響 IR 或繫結,因此我們需要為 fidl 前端編譯器新增測試。

缺點、替代方案和未知

有些疑慮已提出有關 ISO 8859-1 的問題,以 FIDL 語法取代 US-ASCII 字元,但這個字元會完成工作

先前的圖片和參考資料

如上述 Kotlin、C#、Swift 和 TypeScript 皆允許宣告不可為空值的類型。