如何检查D中字段的旧值的后置条件?

时间:2016-09-21 10:27:24

标签: d code-contracts

在C#中,我可以在后置条件中使用Contract.OldValue<T>来检查字段的更改方式。我怎么能在D中这样做?我在文档中看过the relevant page,但它没有提到这一点。

具体来说,我正在编写一个页面渲染器,并且正在跟踪它在成员变量中的页面有多远。我想在out块中声明变量的值至少与开始时一样大(即它应该向下移动页面,而不是向上移动)。 / p>

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 个答案:

答案 0 :(得分:3)

没有语言支持。之前已经讨论了几次(例如,here's a thread from 2013 discussing it),但我怀疑它是否真的会被实现。如果它被实现(如该线程中所讨论的),则存在对代码破坏的担忧,并且在一般情况下甚至不可能(特别是,在D中没有通用的方法来对变量进行深度复制,所以确实存在如果变量不是值类型,则保存变量的原始状态是一种好方法。因此,虽然原则上很好,但从技术角度来看这是有问题的,特别是在一种系统语言中,它给你很多回旋余地,就像复制你的类型一样。

因此,如果您想在out合约中保存变量的原始状态以进行比较,则需要以适合该类型变量的任何方式自行保存它。

答案 1 :(得分:2)

不幸的是没有支持,你必须自己做。但您可以在dlang issue tarcker

上发出功能请求