我有一个特殊的类Model
,需要以非常特定的顺序调用它的方法。
我尝试过这样的事情:
val model = new Model
new MyWrappingClass {
val first = model.firstMethod()
val second = model.secondMethod()
val third = model.thirdMethod()
}
应该按照列出的顺序调用这些方法,但是我看到的是一个明显随机的顺序。
有没有办法让特定顺序调用变量初始化方法?
答案 0 :(得分:1)
我怀疑你的方法是以错误的顺序调用的。但可以肯定的是,你可以尝试这样的事情:
val (first, second, third) = (
model.firstMethod(),
model.secondMethod(),
model.thirdMethod()
)
您的代码可能还有其他一些问题。
答案 1 :(得分:0)
我可以运行1亿个循环,它永远不会出错,如下所示:
class Model {
var done = Array(false,false,false);
def firstMethod():Boolean = { done(0) = true; done(1) || done(2) };
def secondMethod():Boolean = { done(1) = true; !done(0) || done(2) };
def thirdMethod():Boolean = { done(2) = true; !done(0) || !done(1) };
};
请注意,如果按顺序执行,这些方法将返回True;如果按顺序调用,则返回false。
这是你的班级:
class MyWrappingClass {
val model = new Model;
val first = model.firstMethod()
val second = model.secondMethod()
val third = model.thirdMethod()
};
我们检查每次试验的不良行为的功能:
def isNaughty(w: MyWrappingClass):Boolean = { w.first || w.second || w.third };
要测试的简短程序:
var i = 0
var b = false;
while( (i<100000000) && !b ){
b = isNaughty(new MyWrappingClass);
i += 1;
}
if (b){
println("out-of-order behavior occurred");
println(i);
} else {
println("looks good");
}
OpenJDK8 / Ubuntu 15.04上的Scala 2.11.7
当然,这并不能证明错误的顺序是不可能的,只有在一个相当简单的情况下,正确的行为似乎是高度可重复的。