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

How can I check a post-condition for a field's old value in D?

在 C# 中,我可以在文档中使用 Contract.OldValue<T> in a post-condition to check how a field has changed. How can I do this in D? I've read the relevant page,但它没有提到这一点。

具体来说,我正在编写一个页面呈现器,并跟踪它在成员变量中到达页面的底部。我想在 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 方法的开头手动分配它,但我希望框架中有一些东西可以自动执行此操作。

遗憾的是没有对此的支持,你必须自己做。但是您可以在 dlang issue tarcker

上提出功能请求

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

因此,如果您想在输出合同中保存变量的原始状态以供比较,您需要自己以适合该类型变量的任何方式保存它。