RFC-0066:程式設計師明確預設值

RFC-0066:程式設計師警示明確的預設設定
狀態已接受
區域
  • FIDL
說明

FIDL 規格未指出原始和列舉結構欄位是否具有預設值。這項調整提議我們明確指出不會這麼做。

作者
提交日期 (年/月)2018-07-20
審查日期 (年/月)2019-01-14

摘要

FIDL 規格未說明原始和列舉結構欄位是否具有預設值。這項調整提議我們明確指出不會這麼做。

提振精神

在某些語言中,需要初始化並不容易,在其他語言中則無法這麼做。本提案讓參與者接受最低的共分母,但也針對更高級別的語言提供政策。

由於某些類型的結構中預設值不夠清楚,導致某些類型不一致。語言繫結在隱含和明確預設值的處理方式不同。請注意,可為空值類型預設為空值,陣列和向量預設為空白,而非其他類型。C++ 繫結的預設原始類型為 false、0 或 0.0,但如果 FIDL 定義中未提供預設值,就會在建構結構體時指定 Dart 繫結值。

零值通常都是很棒的預設設定,但應明確宣告。舉例來說,如果 uint32_t 代表 FTP 號碼,0 是不是有效值,但 FIDL 無法表示呼叫端應指定數字。

設計

這主要只是為了進一步說明說明文件。只會釐清 FIDL 介面中顯示的語意。開啟繫結改善機會,但不會強制要求。

FIDL 語言規格應包含下列資訊,可能以其他格式呈現:

如果結構體中的原始和列舉欄位未在 FIDL 檔案中宣告的預設值,則「必須」在繫結中執行個體化時指定這些欄位。繫結作者 MAY 可能會遵循預設值、如果主機語言允許的話,以及程式設計人員預期是否相當常見和預期該行為。舉例來說,在 Dart 或 C++ 中,經常會有預設值。但 Go 預設會初始化結構,而提供標準初始化的慣用模式則是提供 NewMyStruct() 函式。在 C 中也應該不會初始化,而程式設計師必須明確定義所有欄位。連線至 MACRO 可能較為合適。如果繫結遵循預設值,它們:必須遵循提供的所有預設值,而如果程式設計人員無法初始化非預設欄位,則「必須」回報錯誤。

說明文件與範例

語言規格和教學課程應更新以反映這項變更。

回溯相容性

但現有行為會因語言繫結而異。這項變更允許所有現有行為,並有助於改善日後的行為。

效能

沒有影響。

安全性

這不僅闡明瞭規格,也讓有心人士更難以誤用介面。這些措施有助於確保安全。

測試

不需測試。

缺點、替代方案和未知

替代做法則是正式定義:

struct Foo {
    int32 bar;
    bool baz;
    float32 wux;
};

在語意上等同於:

struct Foo {
    int32 bar = 0;
    bool baz = false;
    float32 wux = 0.0;
};

但如上文所述,這可能無法擷取重要的語意。

本提案的先前的疊代包含字串,但撰寫時仍可為空值,以表示這些 API 為必要或選用。

先前的圖片和參考資料

不適用