d不用异常.
import std.typecons : Option = Nullable, some = nullable;
alias unwrap = (x) => x.get;
//前面类似rust
Option!int most(string op)(const int[] nums) {
if (nums.length) {
int n = nums[0];
foreach (m; nums[1 .. $]) {
mixin("if (m " ~ op ~ " n) n = m;");
}
return some(n);
} else {
return typeof(return).init;
}
}
alias min = most!"<";
alias max = most!">";
int find_gcd(const int[] nums) {
import std.numeric : gcd;
return gcd(nums.min.unwrap, nums.max.unwrap);
}
unittest {
import std.exception : assertThrown;
import core.exception : AssertError;
assert(find_gcd([3, 5, 12, 15]) == 3);
assertThrown!AssertError(find_gcd([]));
}
结论:
如果nums
为空,程序会(一般
)因不可抓
错误而停止.
冗长解包清楚告诉我们程序在何处有错误
因而停止.
因为Option!int和int
不是同一类型,不能一起混合.如果忘记处理min/max
错误情况,编译器会清楚告诉我们.
因为Option!T
与T
类型不同,可有自己的错误处理如:
T unwrap_or(T)(Option!T opt, T alternate) { }
这样,来在空针
时选择替代
.
由于未用异常,可避免运行时成本
,可不抛
,BetterC
也可用,也可有C
接口,供其他语言使用.
int broken_find_gcd(const int[] nums) {
import std.numeric : gcd;
return gcd(nums.min, nums.max);
// 错误`std.numeric.gcd`模板不能从参`!()(Option!int, Option!int)`推导函数,可用: ...
}
用这样:
int find_gcd(const int[] nums) nothrow {
import std.numeric : gcd;
return gcd(nums.min.unwrap, nums.max.unwrap);
}
如果d
加个nothrow
属性,也许很好.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现