Я пытаюсь создать класс, у которого есть карта ключей -> вызовов функций, и следующий код не ведет себя так, как мне бы хотелось.
class MyClass {
val rnd = scala.util.Random
def method1():Double = {
rnd.nextDouble
}
def method2():Double = {
rnd.nextDouble
}
def method3():Double = {
rnd.nextDouble
}
def method4():Double = {
rnd.nextDouble
}
def method5():Double = {
rnd.nextDouble
}
var m = Map[String,Double]()
m += {"key1"-> method1}
m += {"key2"-> method2}
m += {"key3"-> method3}
m += {"key4"-> method4}
m += {"key5"-> method5}
def computeValues(keyList:List[String]):Map[String,Double] = {
var map = Map[String,Double]()
keyList.foreach(factor => {
val value = m(factor)
map += {factor -> value}
})
map
}
}
object Test {
def main(args : Array[String]) {
val b = new MyClass
for(i<-0 until 3) {
val computedValues = b.computeValues(List("key1","key4"))
computedValues.foreach(element => println(element._2))
}
}
}
Следующий вывод
0.022303440910331762
0.8557634244639081
0.022303440910331762
0.8557634244639081
0.022303440910331762
0.8557634244639081
указывает, что после размещения функции на карте это замороженный экземпляр (каждый ключ выдает одно и то же значение для каждого прохода). Поведение, которое я хотел бы видеть, заключается в том, что ключ будет ссылаться на вызов функции, генерируя новое случайное значение, а не просто возвращая экземпляр, хранящийся на карте.