如何从D中的纯函数中获取详细的错误消息?

Joh*_*tte 6 d

在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;
 }
Run Code Online (Sandbox Code Playgroud)

现在,假设,为了调试或测试目的,我想插入类似的东西:

 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;
 }
Run Code Online (Sandbox Code Playgroud)

因此,如果出现错误情况,我会知道是什么导致了它(我总是可以将它放在一个调试块中).

现在,由于writeln不纯粹,vecMult也不再纯粹.如果vecMult是由其他纯函数调用的低级函数,它调用其他纯函数,那么从vecMult中删除"纯"关键字是非常重要的.

有没有一种很好的方法可以从纯函数中获取调试输出而不会使它变为非纯函数?

Vla*_*eev 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;
 }
Run Code Online (Sandbox Code Playgroud)

请记住使用-debug编译器开关来构建程序以启用debug块.

  • 沃尔特写了一篇关于这个特征的[简短文章](http://www.drdobbs.com/tools/implementing-pure-functions/230700070). (2认同)