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;
}

另一個例子是「boxed」類型,放在離線位置:

// 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 都允許宣告不可為空值的類型。