是否可以在Scala中使用{key – > function call}的映射?
发布时间:2020-12-16 18:46:22 所属栏目:安全 来源:网络整理
导读:我正在尝试创建一个包含键映射的类 – 函数调用,以下代码的行为不符合我的要求. class MyClass { val rnd = scala.util.Random def method1():Double = { rnd.nextDouble } def method2():Double = { rnd.nextDouble } def method3():Double = { rnd.nextDou
我正在尝试创建一个包含键映射的类 – >函数调用,以下代码的行为不符合我的要求.
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 表示一旦将函数放入映射中,它就是一个冻结的实例(每个键为每个传递生成相同的值).我希望看到的行为是键将引用函数调用,生成新的随机值而不是仅返回映射中保存的实例. 解决方法
问题在于你的地图m的签名.你描述了你想把函数放在地图中;但是你已经将它声明为Map [String,Double],它只是一个双字符串的地图.正确的类型是Map [String,()=>双].
因为括号在无参数方法调用中是可选的,所以这里类型的差异非常重要.在填充地图时,在插入时调用方法以匹配类型签名(我相信这是通过隐式转换完成的,但我不是100%肯定). 通过简单地更改地图的声明签名,可以根据需要插入函数,并且可以在computeValues期间计算(需要在第35行上更改为map = {factor – > value()}),从而产生以下输出(在Scala 2.8上测试): 0.662682479130198 0.5106611727782306 0.6939805749938253 0.763581022199048 0.8785861039613938 0.9310533868752249 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容