在D中,假设我有一个像:
这样的函数 private static double vecMult(immutable Vector v1, immutable Vector v2) pure {
double sum = 0.0;
foreach(ulong k; v1.keys)
sum += v1[k] * v2[k];
return sum;
}
现在,假设出于调试或测试目的,我想插入类似的内容:
private static double vecMult(immutable Vector v1, immutable Vector v2) pure {
double sum = 0.0;
foreach(ulong k; v1.keys)
if(!(k in v2)){
writeln(k);
exit(1);
}
sum += v1[k] * v2[k];
return sum;
}
这样,如果出现错误情况,我就知道导致它的原因(我总是可以将它放在调试块中)。
现在,由于writeln不纯净,vecMult也不再纯粹。如果vecMult是由其他纯函数调用的低级函数,则调用其他纯函数,然后删除" pure"来自vecMult的关键词非常重要。
是否有一种很好的方法可以从纯函数中获取调试输出而不会使其变为非纯函数?
答案 0 :(得分:6)
您可以使用debug
块来绕过pure
函数中的纯度。例如:
private static double vecMult(immutable Vector v1, immutable Vector v2) pure {
double sum = 0.0;
foreach(ulong k; v1.keys) {
debug if(!(k in v2)){
writeln(k);
exit(1);
}
sum += v1[k] * v2[k];
}
return sum;
}
请记住使用-debug
编译器开关构建程序以启用debug
块。