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 檔案中宣告的預設值的原始欄位和列舉欄位。如果主機語言允許,且程式設計師預期該行為是常見的,則繫結作者可以採用預設值。舉例來說,在 Dart 或 C++ 中,通常會使用預設值。不過,在 Go 中,結構體預設會初始化,而提供標準初始化的慣用模式則是提供 NewMyStruct() 函式。在 C 中,系統不會進行初始化,而是要求程式設計人員明確定義所有欄位。因此,使用巨集可能會是適當的做法。如果繫結會遵循預設值,則必須遵循提供的所有預設值,且如果程式設計師無法初始化非預設欄位,則必須回報錯誤。

說明文件和範例

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

回溯相容性

不同語言繫結的現有行為各不相同。這項異動會保留所有現有行為,並鼓勵使用者日後採用更佳的行為。

成效

沒有影響。

安全性

這項做法可讓規格更加明確,並減少意外濫用介面的情況。這有助於提升安全性。

測試

不需要進行測試。

缺點、替代方案和未知事項

另一種做法是正式定義:

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

在語意上等同於:

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

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

這個提案的先前版本包含字串,但在撰寫時仍可為空值,因此請提供方法,指出這些字串是必要或選用的。

既有技術與參考資料

不適用