1. 程式人生 > 其它 >dip1038,d的不丟

dip1038,d的不丟

技術標籤:筆記

@不丟,使忽略返回值編譯錯誤.作為不能用異常時補充.避免與通過用返回值報告錯誤的外部函式對接時的漏洞.
原理:
目前,被調呼叫者傳送不能忽略訊號,只能靠異常,但有時不想/不能異常.如:用c/c++寫程式碼,其他語言呼叫d,不想依賴d執行時,不想用異常(太貴了).不丟提供編譯時保護,由於所有函式都有返回型別,所以可與任意函式一起使用.
可能的副作用函式:獲取資源malloc/mmap函式,生成隨機數rand/uniform,引數不同,可能有副作用filter/map.他們的副作用都在於其具體實現.
其他語言:c++[[不丟]],rust#[必須用],…
@不丟導致的錯誤,可用cast(void)

來去除.注意不丟不是型別的一部分,且不傳遞.必須顯式註解.對除了聚集/函式宣告外的宣告無影響.
當且僅當是頂級表示式/逗號式中逗號左邊的賦值式,才認為是可丟的.對帶@不丟的函式/非賦值表示式且型別為帶@不丟的聚集(構,類,聯,介面)時,丟棄會報編譯錯誤.前者檢查語法,後者檢查型別,表明,如果在其他表示式(逗號表示式)中包含不丟函式的函式值,則可能丟棄了返回值了,如:

//未註解型別
struct Result { int n; }
// @nodiscard函式
@nodiscard Result func() { return Result(0); }

void main()
{
    import std.
stdio: writeln; //逗號表示式使用了不丟函式返回值 (writeln("side effect"), func()); } //而另一個是檢查型別, // @nodiscard型別 @nodiscard struct Result { int n; } //未註解不丟的函式 Result func() { return Result(0); } void main() { import std.stdio: writeln; //錯誤,函式返回型別也是逗號表示式型別. (writeln("side effect"
), func()); }

兩種不同檢查.如上,都可用cast(void)來去掉.