【发布时间】:2011-02-14 17:15:23
【问题描述】:
我正在尝试创建一个具有键映射的类 -> 函数调用,但以下代码的行为与我希望的不同。
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
表示一旦将函数放置在映射中,它就是一个冻结的实例(每个键为每次传递产生相同的值)。我希望看到的行为是键将引用函数调用,生成一个新的随机值,而不是仅仅返回映射中保存的实例。
【问题讨论】:
-
为什么会有这么多相同的函数?
-
@Pablo。它们只是我将实际实现的功能的示例占位符。我希望有一个可以调用的潜在函数的宇宙,并且只调用它们的一个子集。
标签: scala map reference function-pointers