@不丢
,使忽略返回值
为编译错误
.作为不能用异常时
的补充
.避免与通过用返回值
报告错误的外部函数
对接时的漏洞
.
原理:
目前,被调
向调用者
发送不能忽略信号
,只能靠异常
,但有时不想/不能
用异常
.如:用c/c++写代码,其他语言调用d,不想依赖d运行时,不想用异常(太贵了)
.不丢
提供编译时保护,由于所有函数都有返回类型
,所以可与任意
函数一起使用.
可能的副作用函数:获取资源
的malloc/mmap
函数,生成随机数
的rand/uniform
,参数不同,可能有副作用
的filter/map
.他们的副作用都在于其具体实现.
其他语言:c++
的[[不丢]]
,rust
的#[必须用]
,…
@不丢
导致的错误,可用cast(void)
来去除.注意不丢
不是类型的一部分
,且不传递.必须显式
注解.对除了聚集/函数声明
外的声明无影响.
当且仅当是顶级表达式/逗号式中逗号左边的赋值式
,才认为是可丢
的.对带@不丢的函数/非赋值表达式且类型为带@不丢的聚集(构,类,联,接口)
时,丢弃
会报编译错误
.前者检查语法
,后者检查类型
,表明,如果在其他表达式(逗号表达式)中包含不丢函数的函数值,则可能丢弃了返回值了
,如:
struct Result { int n; }
@nodiscard Result func() { return Result(0); }void main()
{import std.stdio: writeln;(writeln("side effect"), func());
}
@nodiscard struct Result { int n; }
Result func() { return Result(0); }void main()
{import std.stdio: writeln;(writeln("side effect"), func());
}
两种不同检查
.如上,都可用cast(void)
来去掉.