gpt4 book ai didi

scala - 在Scala中是否可能有{key-> function call}的映射?

转载 作者:行者123 更新时间:2023-12-04 09:21:18 24 4
gpt4 key购买 nike

我正在尝试创建一个具有键->函数调用映射的类,并且下面的代码不符合我的期望。

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

表示一旦将函数放置在 map 中,它就是一个卡住的实例(每个键为每个遍历产生相同的值)。我想看到的行为是该键将引用一个函数调用,从而生成一个新的随机值,而不仅仅是返回映射中保存的实例。

最佳答案

问题出在您的 map m的签名上。您描述了要在 map 中放置函数;但是,您已将其声明为Map[String, Double],它只是将字符串映射为 double 的映射。正确的类型是Map[String, () => Double]

由于方括号在no-arg方法调用中是可选的,因此此处的类型差异非常重要。填充 map 时,将在插入时调用方法以匹配类型签名(我相信这是通过隐式转换完成的,但我不确定100%)。

通过简单地更改 map 的声明签名,可以按需插入函数,并且可以在computeValues期间进行评估(要求将第35行更改为map += {factor -> value()}),从而得到以下输出(在Scala 2.8上进行了测试):

0.662682479130198
0.5106611727782306
0.6939805749938253
0.763581022199048
0.8785861039613938
0.9310533868752249

关于scala - 在Scala中是否可能有{key-> function call}的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4995052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com