【问题标题】:How can I get detailed error messages from a pure function in D?如何从 D 中的纯函数获取详细的错误消息?
【发布时间】:2014-08-19 22:29:14
【问题描述】:

在 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 是由其他纯函数调用的低级函数,它调用其他纯函数,那么从 vecMult 中删除“pure”关键字是不平凡的。

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

【问题讨论】:

    标签: d


    【解决方案1】:

    您可以使用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 块。

    【讨论】:

    • Walter 写了一封关于此功能的short article
    • 谢谢。很高兴看到有一个很好的解决方案。
    • @eco 那篇文章很不错。但是,此答案的未来读者请注意:该函数仍将像纯函数一样进行优化,因此仅在调用该函数时才会执行调试内容,而不是在访问/使用缓存的结果时执行。
    • 另一种选择是将某种日志累加器作为参数传递给它。只要不传递immutable,函数就可以写入它(D 中的pure 限制了函数对参数的访问范围,它并不要求所有参数实际上都是不可变的)。但是对于调试,debug writeln 是迄今为止最简单的。
    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2012-12-26
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多