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

Oggi questa asserzione non è riuscita e volevo vedere i valori effettivi di row e col. Unfortunetly, assert non è come writeln o writefln, quindi non posso fare qualcosa di simile:Come stampare di più quando l'asserzione fallisce?

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

Ho provato anche questo:

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

ma non posso chiamare to perché opIndex è puro . Potrei temporaneamente rimuovere pure da opIndex, ma questo innesca una lunga catena di annullamenti perché altri metodi puri chiamano opIndex. Non essere in grado di chiamare to elimina anche la possibilità di creare la mia funzione per passare a assert.

Quindi, che altro c'è da provare? Voglio solo stampare tali valori quando l'asserzione fallisce.

risposta

10

Per il momento, se si desidera eseguire la conversione da stringhe in una funzione pure, è necessario scrivere autonomamente le funzioni di conversione. Alcuni lavori sono stati dedicati alla creazione di funzioni come std.conv.topure, ma non abbiamo ancora raggiunto il punto in cui si trovano. Troppi costrutti di livello inferiore non sono ancora pure, anche se teoricamente potrebbero essere. Un sacco di lavoro viene messo nel creare cose const -corretto per la prossima versione di dmd (2.059), e alcuni lavori su pure vanno di pari passo con quello, dal momento che certe funzioni in Object devono essere pure, const, @safe e nothrow. Quindi, ci sono buone probabilità che std.conv.to sia in grado di essere pure per la conversione da e verso le stringhe con la prossima versione. E anche se non dovesse accadere con la prossima versione, succederà presto, poiché è necessario che accada (come illustra la tua situazione). Ma fino ad allora, sei da solo.

Supponendo che tutto questo è stato risolto, quindi il modo migliore per creare una stringa per la sua affermazione sarebbe

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

che lavorerà in una funzione impura, ma fino a quando format può essere pure, ha vinto funziona in uno pure.

Ora, è possibile mettere materiale impuro in un blocco debug. Quindi, se si voleva, si poteva fare

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

ma poi ci si deve compilare con -debug o la vostra affermazione non sarebbe stato eseguito. Indipendentemente da ciò, debug ti consentirà di inserire il codice impuro nella tua funzione pure a scopo di debug e verrà compilato finché il flag -debug viene utilizzato, quindi può servire come soluzione temporanea per le attuali carenze di format e to.

Problemi correlati