| RFC-0042:不可為空值的型別 | |
|---|---|
| 狀態 | 已遭拒 |
| 區域 |
|
| 說明 | FIDL 程式庫作者可以使用「?」將某些型別和成員標示為可為空值。這項提案建議將型別和成員標示為不可為空值。 |
| 作者 | |
| 提交日期 (年-月-日) | 2019-04-01 |
| 審查日期 (年-月-日) | 2019-04-01 |
拒絕原因
不過,在版面配置支援可為空值的環境中 (例如資料表欄位、可為空值的型別別名),強制執行存在性的基本概念可能會納入其他 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 使用者最希望我們提供的功能。
說明文件和範例
文法和語言說明文件必須更新。
回溯相容性
這項功能可回溯相容。
效能
部分不可為空值的型別 (例如結構體) 比可為空值的變體更精簡,因此可提高傳輸效率。
安全性
東尼·霍爾將空值參照描述為「十億美元的錯誤」,並可能導致安全漏洞。
測試
由於編譯器異動不會影響 IR 或繫結,因此我們需要為 fidl 前端編譯器新增測試。
缺點、替代方案和未知事項
有人擔心 ISO 8859-1 會取代 FIDL 語法中的 US-ASCII 字元,但這個字元可以完成工作。
既有技術和參考資料
如上所述,Kotlin、C#、Swift 和 TypeScript 都允許將型別宣告為不可為空值。