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)来去掉.

posted @   zjh6  阅读(8)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示