调用保存在地图中的函数

1am*_*bda 2 collections scala map

我在读斯卡拉学校.根据指南,Map可以包含像

def adder(x: Int, y:Int): Int = x + y
def add2(x:Int):Int = adder(2, x:Int)
val add3 = adder(3, _:Int)

val map = Map(
  "adder" -> { adder(_, _) },
  "add2" -> { add2(_) },
  "add3" -> { add3(_) }
)
Run Code Online (Sandbox Code Playgroud)


好.上面的代码是编译的.但是如何调用地图中保存的功能?这些代码不起作用

map.get("adder")(2, 3) // compile error
val adderFunc: (Int, Int) => Int = map.get("adder") // compile error
Run Code Online (Sandbox Code Playgroud)

Scala编译器提供此错误消息

[error] /home/user/scalaExample/src/test/scala/CollectionBasicsTest.scala:61: Option[Object] does not take parameters
[error]     map.get("adder")(2, 3) // compile error
[error]                     ^
[error] /home/user/scalaExample/src/test/scala/CollectionBasicsTest.scala:62: type mismatch;
[error]  found   : Option[Object]
[error]  required: (Int, Int) => Int
[error]  val adderFunc: (Int, Int) => Int = map.get("adder") // compile error
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 5

这里有两个问题.一个是get返回Option.您可以使用它map("adder")来取回功能.

第二个也是最基本的问题是你在地图中放了两个完全不同的东西:一个带有两个参数的函数和一个带有一个参数的函数.这些类型完全不同,这意味着为地图的值推断的类型是AnyRef.所以,一旦你找回这样的对象,你就不能对它做任何事情,然后再回到某种有用的类型.

只保留地图中具有相同数量参数的函数,并使用第一个提示,事情就可以了.