scala - 调用保存在 map 中的函数

标签 scala collections dictionary

我正在阅读 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/

相关文章:

scala - 为什么我不能在 Scala 中打印调试消息?

scala - 如何使用 capistrano 在远程机器上启动 play2 应用程序

java - 在列表中搜索名称并显示所有匹配项

Javascript 或 jQuery png 播放器

java - 在 Jaxb 中编码 map 时出现问题

scala - 如何查询Spark数据集的列名?

scala - 链接到 scaladoc 的来源?

java - 将元素添加到限制大小列表

java - 改进的集合迭代器

java - 如何使用 Stream 将 MultiValueMap<String,String> 转换为 Map<String, List<Long>>?