dip1038,d的不丟
阿新 • • 發佈:2020-12-13
技術標籤:筆記
@不丟
,使忽略返回值
為編譯錯誤
.作為不能用異常時
的補充
.避免與通過用返回值
報告錯誤的外部函式
對接時的漏洞
.
原理:
目前,被調
向呼叫者
傳送不能忽略訊號
,只能靠異常
,但有時不想/不能
用異常
.如:用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)
來去掉.