在D中输入和输出合同之间传递值

在D中输入和输出合同之间传递值,d,D,我是D的新手。我开始使用合同,我觉得它们很棒。然而,我似乎在文档中找不到可以存储合同可用的本地值的地方,比如 结构向量2(T){ tx=0; T y=0; 向量2!T opBinary(字符串op)(常量参考向量2!T rhs) 如果(op=“+”||op=”-“|op=”*“|op=”/”) 在{ T prevx=这个.x; T prevy=this.y; } 出去{ 静态if(isFloatingPoint!T){ 断言(mixin(“approxEqual(this.x,prevx”~op

我是D的新手。我开始使用合同,我觉得它们很棒。然而,我似乎在文档中找不到可以存储合同可用的本地值的地方,比如

结构向量2(T){ tx=0; T y=0; 向量2!T opBinary(字符串op)(常量参考向量2!T rhs) 如果(op=“+”||op=”-“|op=”*“|op=”/”) 在{ T prevx=这个.x; T prevy=this.y; } 出去{ 静态if(isFloatingPoint!T){ 断言(mixin(“approxEqual(this.x,prevx”~op~“rhs.x)”); 断言(mixin(“approxEqual(this.y,prevy”~op~“rhs.y)”); }否则{ 断言(mixin(“this.x==(prevx”~op~“rhs.x)”); 断言(mixin(“this.y==(prevy”~op~“rhs.y)”); } } 身体{ 向量2!T ret; mixin(“ret.x=this.x”~op~“rhs.x;”; 混合(“ret.y=this.y”~op~“rhs.y;”); 返回ret; } }
在执行主体之前,我需要x和y的值,以便在out块中正确验证结果。然而,prevx和prevy显然不能在作用域之间移动。是否有某种方法在输入和输出合同之间传递数据

唉,没有。您最好将其存储在外部的其他变量中,这样就可以使用递归等方法来解决问题:(

另一种可能性是在主体内部编写断言。为了优化,可以将其包装为静态if,并检查一些命令行定义的参数,或者它是否不是在发布模式或something中构建的。是的,但它不再是真正的契约,它只是另一种常规断言。契约在主体外部有特殊语法因为它们实际上是在主体外部继承和检查的。在子类中,如果覆盖主体,则主体内部的所有检查也会被覆盖…但是对于In协定,旧的检查仍然存在,并被检查为
super.In|contract | this.In|contract
-接口的协定仍然有效(因为您仍然可以通过接口使用该类!)。与out契约相同,但它在那里是
&&
。这一事实不同于body…并使var存储变得困难。