如何检查 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 中的变量进行深度复制,所以确实没有如果变量不是值类型,这不是保存变量原始状态的好方法)。因此,虽然原则上最好,但从技术角度来看这是有问题的,尤其是在一种系统语言中,它为您提供了大量的余地,让您了解复制类型的工作方式。
因此,如果您想在输出合同中保存变量的原始状态以供比较,您需要自己以适合该类型变量的任何方式保存它。
在 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 中的变量进行深度复制,所以确实没有如果变量不是值类型,这不是保存变量原始状态的好方法)。因此,虽然原则上最好,但从技术角度来看这是有问题的,尤其是在一种系统语言中,它为您提供了大量的余地,让您了解复制类型的工作方式。
因此,如果您想在输出合同中保存变量的原始状态以供比较,您需要自己以适合该类型变量的任何方式保存它。