2012-02-27 3 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]; 
} 

Сегодня это утверждение не удалось, и я хотел видеть фактические значения row и col. Unfortunetly, assert не нравится writeln или writefln, так что я не могу сделать что-то вроде:Как печатать больше, когда утверждение не удается?

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)); 

Но я не могу назвать, потому что toopIndex чисто , Я мог временно удалить pure с opIndex, но это вызывает длинную цепочку отмен, потому что другие чистые методы вызывают opIndex. Невозможность позвонить to также исключает возможность создания моей собственной функции для перехода на assert.

Итак, что еще можно попробовать? Я просто хочу напечатать такие значения, когда утверждение терпит неудачу.

ответ

10

На данный момент, если вы хотите конвертировать в строки или из строк в функции pure, вам придется самостоятельно писать функции преобразования. Некоторая работа посвящена созданию таких функций, как std.conv.topure, но мы еще не достигли точки, где они находятся. Слишком много конструкций нижнего уровня по-прежнему не pure, даже если они теоретически могут быть. Много работы вносятся в создание материала const -correct для следующей версии dmd (2.059), а некоторые работы на pure идут рука об руку с этим, поскольку некоторые функции в Object должны быть pure, const, @safe, и nothrow. Итак, есть хороший шанс, что 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, поэтому он может служить временным обходным решением для текущих недостатков format и to.

Смежные вопросы