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 是使用者最常要求的功能

說明文件和範例

文法和語言文件需要更新。

回溯相容性

這項功能可回溯相容。

成效

某些不可為空值的型別 (例如結構體) 的表示法較精簡 而不是可為空值的變體,這樣可以提高傳輸效率。

安全性

Tony Hoare 將空值提及稱為 「億美元錯誤」也能在背景和網路中 安全漏洞

測試

做為編譯器變更時,IR 或繫結沒有任何影響,我們需要新增 測試 fidl 前端編譯器。

缺點、替代方案和未知

有些疑慮是因為 ISO 8859-1 取代 FIDL 語法中的 US-ASCII 字元,但這個字元 能替你完成工作

既有藝術品和參考資料

如上述 Kotlin 所述,C#、Swift 和 TypeScript 全都允許類型 。