2016-09-21 4 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

関連する問題