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

Hoy esta afirmación ha fallado, y quería ver los valores reales de row y col. Desafortunadamente, no es como assertwriteln o writefln, así que no puedo hacer algo como:¿Cómo imprimir más cuando falla la aserción?

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

incluso intenté esto:

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

Pero no puedo llamar to porque es puro opIndex . Podría eliminar temporalmente pure de opIndex, pero eso desencadena una cadena larga de undos porque otros métodos puros llaman al opIndex. No poder llamar al to también elimina la posibilidad de crear mi propia función para pasar al assert.

Entonces, ¿qué más hay que probar? Solo quiero imprimir esos valores cuando la afirmación falla.

Respuesta

10

Por el momento, si quiere convertir a cadenas desde o en una función pure, tendrá que escribir las funciones de conversión usted mismo. Se han realizado algunos trabajos para realizar funciones como std.conv.topure, pero aún no hemos llegado al punto en el que están. Demasiadas construcciones de nivel inferior todavía no son pure, incluso si teóricamente podrían serlo. Se está trabajando mucho para hacer las cosas const -corregir para la próxima versión de dmd (2.059), y algo de trabajo en pure va de la mano con eso, ya que ciertas funciones en Object van a tener que ser pure, const, @safe y nothrow. Por lo tanto, hay una buena posibilidad de que std.conv.to sea pure para convertir ay de cadenas con la próxima versión. E incluso si no sucede con la próxima versión, va a suceder pronto, ya que es necesario que suceda (como lo ilustra su situación). Pero hasta entonces, estás solo.

Suponiendo que todo eso se solucionó, entonces la mejor manera de crear una secuencia para su afirmación sería

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

que trabajará en función impura, pero hasta format puede haber pure, ganó No funciona en un pure.

Ahora, usted puede poner cosas impuras en un bloque debug. Por lo tanto, si quisiera, podría hacer

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

pero entonces usted tendría que compilar con -debug o su afirmación de que no se ejecute. Pero independientemente, debug le permitirá poner código impuro en su función pure para depuración y se compilará siempre que se use el indicador -debug, por lo que puede servir como una solución temporal para las deficiencias actuales de format y to.

Cuestiones relacionadas