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)
来去掉.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现