2012-02-27 81 views
5
Real opIndex(size_t row, size_t col = 0) const pure nothrow { 
    assert(col + row * Col < Row * Col, "index out of bounds."); 
    return _data[col + row * Col]; 
} 

今天这个断言失败了,我想看看rowcol的实际值。偏偏assert不像writelnwritefln,所以我不能做这样的事情:断言失败时如何打印更多内容?

assert(col + row * Col < Row * Col, "index out of bounds. row: %d col: %d", row, col); 

我甚至试过这样:

assert(col + row * Col < Row * Col, "index out of bounds" ~ to!string(row)~ " " ~ to!string(col)); 

但我不能叫to因为opIndex是纯。我可以暂时从opIndex中删除pure,但是这会触发长链撤消,因为其他纯粹的方法正在呼叫opIndex。不能拨打to也消除了创建我自己的功能传递到assert的可能性。

那么,还有什么可以尝试?我只是想在断言失败时打印这些值。

回答

10

目前,如果你想在pure函数中转换字符串或从字符串转换,你将不得不自己编写转换函数。一些工作已经进入制作功能,如std.conv.topure,但我们还没有达到他们的地步。尽管它们在理论上可能是这样,但是较低级别的构造仍然不是pure。很多工作正在投入生产const - 正确的下一个版本的dmd(2.059),有些工作与pure是一致的,因为Object中的某些功能将必须是pureconst@safenothrow。因此,std.conv.to很有可能是pure,用于与下一版本的字符串进行转换。即使它在下一个版本中没有发生,它也会很快发生,因为它确实需要发生(如你的困境所示)。但在此之前,你是独立的。

假设所有的这是整理出来,为您创造断言字符串将

assert(col + row * col < row * col, 
     format("index out of bounds. row: %d col: %d", row, col)); 

将在一个非纯函数工作,那么最好的办法,但直到format可以pure,它赢得在pure之一工作。

现在,你可以把不纯的东西放在debug块。所以,如果你愿意,你可以做

debug 
{ 
    assert(col + row * col < row * col, 
      format("index out of bounds. row: %d col: %d", row, col)); 
} 

但你不得不用-debug或您的断言编译将无法运行。但是不管debug将允许你在你的pure函数中使用不纯代码来进行调试,只要使用-debug标志就会被编译,所以它可以作为当前缺陷formatto的临时解决方法。