2016-09-21 82 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中沒有通用方法來對變量進行深層副本,所以真的沒有如果它不是值類型,那麼保存變量的原始狀態不失爲一種好方法)。所以,雖然從原則上講它會很好,但從技術的角度來看,這是很成問題的,特別是在系統語言中,它可以讓你在複製類型的工作方式方面有很大的迴旋餘地。

因此,如果您想要保存變量的原始狀態以便在輸出合同中進行比較,您需要以適合該類型變量的任何方式自行保存它。

2

不幸的是,沒有支持,你必須自己做。但是您可以在dlang上發出功能請求issue tarcker