如何在scala 2.10中调用MapObject中定义的方法

时间:2013-11-01 04:35:49

标签: scala scala-2.10

我是Scala的新手,我在下面有疑问。

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

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

很多感谢您的亲切帮助,等待您的回答^ _ ^

2 个答案:

答案 0 :(得分: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]

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

答案 1 :(得分:0)

问题是您的mapObj类型为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]

类型