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

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

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

既有技術和參考資料

不適用