在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
方法的开头手动分配它,但是我希望框架中有一些东西可以自动执行此操作。
答案 0 :(得分:3)
没有语言支持。之前已经讨论了几次(例如,here's a thread from 2013 discussing it),但我怀疑它是否真的会被实现。如果它被实现(如该线程中所讨论的),则存在对代码破坏的担忧,并且在一般情况下甚至不可能(特别是,在D中没有通用的方法来对变量进行深度复制,所以确实存在如果变量不是值类型,则保存变量的原始状态是一种好方法。因此,虽然原则上很好,但从技术角度来看这是有问题的,特别是在一种系统语言中,它给你很多回旋余地,就像复制你的类型一样。
因此,如果您想在out合约中保存变量的原始状态以进行比较,则需要以适合该类型变量的任何方式自行保存它。
答案 1 :(得分:2)
不幸的是没有支持,你必须自己做。但您可以在dlang issue tarcker
上发出功能请求