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)来去掉.
浙公网安备 33010602011771号