我正在阅读 Scala School .根据指南,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(_) }
)
好的。以上代码已编译。但是如何调用保存在 map 中的函数呢?这些代码不起作用
map.get("adder")(2, 3) // compile error
val adderFunc: (Int, Int) => Int = map.get("adder") // compile error
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
最佳答案
这里有两个问题。一个是 get
返回一个 Option
。您可以使用 map("adder")
来取回函数。
第二个也是最基本的问题是,您在映射中放置了两个完全不同的东西:一个具有两个参数的函数和两个具有一个参数的函数。这些类型是完全不同的,这意味着映射值的推断类型是 AnyRef
。因此,一旦您取回此类对象,在将其还原为某种有用的类型之前,您无法对其进行任何操作。
在映射中只保留具有相同数量参数的函数,并使用第一个技巧,一切都会奏效。
关于scala - 调用保存在 map 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25599999/