如何检查字段的post条件';D中的旧值是多少?
在C#中,我可以在post条件中使用来检查字段是如何更改的。我怎样才能在D中做到这一点?我已经阅读了文档,但没有提到这一点 具体地说,我正在编写一个页面渲染器,并在一个成员变量中跟踪它在页面下方的距离。我想在如何检查字段的post条件';D中的旧值是多少?,d,code-contracts,D,Code Contracts,在C#中,我可以在post条件中使用来检查字段是如何更改的。我怎样才能在D中做到这一点?我已经阅读了文档,但没有提到这一点 具体地说,我正在编写一个页面渲染器,并在一个成员变量中跟踪它在页面下方的距离。我想在out块中断言变量的值至少与开始时一样大(即,它应该向下移动页面,而不是向上移动) 显然,我可以添加另一个字段来保存旧值,并在writeText方法的开始处手动分配它,但我希望框架中有某种东西可以自动完成此操作。不幸的是,没有支持此操作,您必须自己完成。但是您可以在dlang上提出功能请求不
out
块中断言变量的值至少与开始时一样大(即,它应该向下移动页面,而不是向上移动)
显然,我可以添加另一个字段来保存旧值,并在
writeText
方法的开始处手动分配它,但我希望框架中有某种东西可以自动完成此操作。不幸的是,没有支持此操作,您必须自己完成。但是您可以在dlang上提出功能请求不幸的是,该功能不受支持,您必须自己完成。但是您可以在dlang上请求功能,因为dlang没有语言支持。它之前已经讨论过几次(例如),但我怀疑它是否真的能够实现。如果实现了它(如该线程中所讨论的),则可能会出现代码中断的问题,在一般情况下甚至不可能这样做(特别是,没有通用的方法在D中对变量进行深度复制,因此如果变量不是值类型,则确实没有一种保存该变量原始状态的好方法)。因此,虽然原则上有这样的功能是很好的,但从技术角度来看,这是有问题的,特别是在一种系统语言中,它为您提供了大量的余地,让您可以了解复制类型之类的内容的工作方式
因此,如果您想保存变量的原始状态以便在out契约中进行比较,您需要自己以适合该类型变量的任何方式进行保存。没有语言支持。它之前已经讨论过几次(例如),但我怀疑它是否真的能够实现。如果实现了它(如该线程中所讨论的),则可能会出现代码中断的问题,在一般情况下甚至不可能这样做(特别是,没有通用的方法在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
{
...
}
}