在Scala中指定变量初始化顺序

时间:2015-08-28 06:15:54

标签: scala

我有一个特殊的类Model,需要以非常特定的顺序调用它的方法。

我尝试过这样的事情:

val model = new Model

new MyWrappingClass {
 val first = model.firstMethod()
 val second = model.secondMethod()
 val third = model.thirdMethod()

}

应该按照列出的顺序调用这些方法,但是我看到的是一个明显随机的顺序。

有没有办法让特定顺序调用变量初始化方法?

2 个答案:

答案 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

当然,这并不能证明错误的顺序是不可能的,只有在一个相当简单的情况下,正确的行为似乎是高度可重复的。