Я могу пробежать 100 миллионов циклов, где он никогда не получает приказ неправильно, а именно:
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) };
};
Обратите внимание, что эти методы возвращают Правда, если делать из того и ложно при вызове в порядке.
Вот ваш класс:
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");
}
Scala 2.11.7 на OpenJDK8/Ubuntu 15.04
Конечно, это не доказывает, что невозможно иметь неправильный порядок, только правильное поведение кажется очень повторяемым в довольно простом случае.
Как вы говорите, что это называется в случайном порядке? – thirstycrow
@thirstycrow Кажется, что из-за ошибки, которую я испытываю. Но даже если это окажется чем-то другим, мне интересно знать. Это должна быть спецификация Scala, но я не мог ее найти. – BAR
Вы уверены, что это как можно ближе к вашему фактическому коду? Когда я реализую его с помощью 'println' в методах модели, порядок кажется правильным. Ваш фактический код не объявляет эти валы «lazy val», если это возможно? –