| RFC-0066:程式設計師諮詢 - 明確預設值 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 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;
};
但如上文所述,這可能無法擷取重要的語意。
這個提案的先前疊代包含字串,但在撰寫時,這些字串仍可為空值,因此請指出這些字串為必要或選用。
既有技術和參考資料
不適用