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

Dziś to stwierdzenie nie powiodło się i chciałem zobaczyć rzeczywiste wartości row i col. Unfortunetly, assert nie jest jak writeln lub writefln, więc nie mogę zrobić coś takiego:Jak wydrukować więcej, gdy asercja się nie powiedzie?

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

Próbowałem nawet to:

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

Ale nie mogę zadzwonić to ponieważ opIndex jest czysta . Mogłem tymczasowo usunąć pure z opIndex, ale to wyzwala długi łańcuch cofnięć, ponieważ inne czyste metody wywołują opIndex. Niemożliwość wywołania to eliminuje również możliwość utworzenia własnej funkcji przekazywania do assert.

Co jeszcze można spróbować? Chcę wydrukować takie wartości, gdy asercja się nie powiedzie.

Odpowiedz

10

Na razie, jeśli chcesz konwertować na ciągi znaków w funkcji pure, musisz sam napisać funkcje konwersji. Niektóre prace zostały już wprowadzone w funkcje takie jak std.conv.topure, ale nie osiągnęliśmy jeszcze punktu, w którym się znajdują. Zbyt wiele konstruktów niższego poziomu nadal nie jest, nawet jeśli teoretycznie mogłyby być. Dużo pracy wkłada się w robienie rzeczy w wersji const - poprawne dla następnej wersji dmd (2.059), a niektóre prace nad pure idą w parze z tym, ponieważ pewne funkcje w Object będą musiały być pure, const, @safe i nothrow. Jest więc duża szansa, że ​​std.conv.to będzie mogła być pure do konwersji do i od ciągów z następną wersją. I nawet jeśli nie wydarzy się to przy następnym wydaniu, stanie się to wkrótce, ponieważ tak się musi stać (jak ilustruje to twoja sytuacja). Ale do tego czasu jesteś sam.

Zakładając, że wszystko to było załatwione, to najlepszym sposobem, aby utworzyć ciąg dla twierdzenie byłoby

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

które będą pracować w zanieczyszczonej funkcji, ale dopóki format może być pure, to wygrał działa w numerze pure.

Teraz możesz może umieścić nieczystości w bloku debug. Tak więc, jeśli chcesz, możesz zrobić

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

ale wtedy trzeba by skompilować z -debug lub swojej twierdzenie nie będzie działać. Niezależnie od tego, debug pozwoli ci umieścić nieczytelny kod w twojej funkcji pure do celów debugowania i zostanie skompilowany tak długo, jak długo będzie używana flaga -debug, dzięki czemu może służyć jako tymczasowe obejście bieżących niedociągnięć format i to.