2015-08-28 3 views
2

У меня есть специальный класс Model, который должен иметь методы, называемые в очень определенном порядке.Укажите порядок инициализации переменной в Scala

Я пытался сделать что-то вроде этого:

val model = new Model 

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

} 

методы должны быть названы в указанном порядке, но я вижу, по-видимому, в случайном порядке.

Есть ли способ получить вызовы переменной инициализации в определенном порядке?

+0

Как вы говорите, что это называется в случайном порядке? – thirstycrow

+0

@thirstycrow Кажется, что из-за ошибки, которую я испытываю. Но даже если это окажется чем-то другим, мне интересно знать. Это должна быть спецификация Scala, но я не мог ее найти. – BAR

+0

Вы уверены, что это как можно ближе к вашему фактическому коду? Когда я реализую его с помощью 'println' в методах модели, порядок кажется правильным. Ваш фактический код не объявляет эти валы «lazy val», если это возможно? –

ответ

1

Я сомневаюсь, что ваши методы вызваны в неправильном порядке. Но, конечно, вы можете попробовать что-то вроде этого:

val (first, second, third) = (
    model.firstMethod(), 
    model.secondMethod(), 
    model.thirdMethod() 
) 

У вас может возникнуть другая проблема с кодом.

0

Я могу пробежать 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

Конечно, это не доказывает, что невозможно иметь неправильный порядок, только правильное поведение кажется очень повторяемым в довольно простом случае.