Возможно ли в Scala иметь карту {ключ -> вызов функции}?

Я пытаюсь создать класс, который имеет карту ключей -> вызовов функций, и следующий код ведет себя не так, как мне хотелось бы.

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

показывает, что как только функция помещена в карту, она является замороженным экземпляром (каждый ключ производит одно и то же значение для каждого прохода). Я бы хотел, чтобы ключ ссылался на вызов функции, генерируя новое случайное значение, а не просто возвращал экземпляр, хранящийся в карте.

7
задан Bruce Ferguson 14 February 2011 в 17:15
поделиться