1

我是 Scala 的新手,我有以下问题。

def test() {
  var mapObj = Map(1->'a',"Add"->((x:Int,y:Int)=>(x+y)))
  mapObj("Add")
}
test()

如何使用参数 x:1 和 y:2 调用方法“Add”,然后得到结果 3?

非常感谢您的热心帮助,等待您的答复^_^

4

2 回答 2

0

如果没有键值对1 -> 'a',这很简单。

scala> var mapObj = Map("Add"->((x:Int,y:Int)=>(x+y)))
mapObj: scala.collection.immutable.Map[String,(Int, Int) => Int] = Map(Add -> <function2>)

scala> mapObj.get("Add").get.apply(1,2)
res0: Int = 3

当键和值具有不同的类型时IntString对于键和CharFunction2,类型推断器使用最常见的超类型,即Any. 然后你会得到Map[Any, Any]难以使用的类型。

尝试使键具有相同的类型,值具有相同的类型。类型推断器完成其余工作,您可以使用上面的代码。

于 2013-11-01T05:18:47.910 回答
0

问题是您的mapObjis 类型Map[Any,Any],因此mapObj("Add")返回类型的元素Any(实际上是 Function2)。因此,编译器不允许您将其用作函数。您需要将其转换为 Function2 然后使用它。

scala> val mapObj = Map(1->'a',"Add"->((x:Int,y:Int)=>(x+y)))
mapObj: scala.collection.immutable.Map[Any,Any] = Map(1 -> a, Add -> <function2>
)

scala> mapObj("Add")
res8: Any = <function2>

scala> mapObj("Add").asInstanceOf[scala.Function2[Int,Int,Int]](1,2)
res9: Int = 3

为避免所有这些,建议您1->'a'从地图中排除,并将地图作为类型Map[Int, Function]

于 2013-11-01T05:19:08.600 回答