2016-09-21 3 views
0

В C# я мог бы использовать Contract.OldValue<T> в пост-состоянии, чтобы проверить, как изменилось поле. Как я могу это сделать в D? Я прочитал the relevant page в документации, но не упоминает об этом.Как проверить пост-условие для старого значения поля в D?

В частности, я пишу визуализатор страниц и отслеживаю, как далеко по странице, полученной в переменной-члене. Я хотел бы утверждать в блоке out, что значение переменной не меньше, чем было в начале (т. Е. Оно должно было перемещаться по странице, а не вверх).

class Renderer 
{ 
    private: 
     float pos; 

    public: 
     void writeText(string text) 
     in 
     { 
      assert(text !is null); 
     } 
     out 
     { 
      // how to do this? 
      assert(pos >= oldPos); 
     } 
     body 
     { 
      ... 
     } 
} 

Очевидно, что я мог бы добавить еще одно поле просто держать старое значение, и вручную назначить его в начале метода writeText, но я надеюсь, что есть что-то в рамках который будет делать это автоматически.

ответ

2

Для этого нет никакой языковой поддержки. Это обсуждалось несколько раз раньше (например, here's a thread from 2013 discussing it), но я сомневаюсь, что это когда-нибудь будет реализовано. Есть проблемы с поломкой кода, если он реализован (как обсуждалось в этом потоке), и это вообще не возможно в общем случае (в частности, нет общего способа сделать глубокую копию переменной в D, так что действительно существует 't хороший способ сохранить исходное состояние переменной, если это не тип значения). Таким образом, хотя было бы неплохо иметь в принципе, это проблематично с технической точки зрения, особенно на системном языке, который дает вам тонну свободы с тем, как работают такие вещи, как копирование вашего типа.

Итак, если вы хотите сохранить исходное состояние переменной для сравнения в контракте на выход, вам необходимо сохранить его самостоятельно, каким бы то ни было образом подходит для этого типа переменной.

2

К сожалению, для этого нет поддержки, вы должны сделать это самостоятельно. Но вы можете сделать запрос функции на dlang issue tarcker

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