将列表转换为地图并在一行中获取项目

时间:2014-06-11 22:05:58

标签: scala map

尝试:

(List(('c', 1)).toMap)('c')

错误:

found   : Char('c')
required: <:<[(Char, Int),(?, ?)]

然而,这很好用:

val m = List(('c', 1)).toMap
m('c') // gives 1 as expected

为什么首先将它存储在变量中是否重要?这可能是个错误吗?

1 个答案:

答案 0 :(得分:6)

问题是toMap的完整签名如下:

def toMap[T, U](implicit ev: <:<[A, (T, U)]): Map[T, U]

集合API设计者不希望List(1).toMap进行编译,因此它们要求您提供隐式证据,证明列表的内容是元组。

通常你不必考虑这个 - 你只需要在没有参数的情况下调用toMap,编译器就会找到隐含的证据。当你写一些看起来像是用参数调用toMap的东西时,你会遇到麻烦,因为它总是可能明确提供隐式参数。

最简单的解决方法(假设您不想定义单独的变量)是明确调用applywhatever(foo)只是whatever.apply(foo)的语法糖(除非whatever是方法),如果你编写以下内容,你的代码将编译:

scala> List(('c', 1)).toMap.apply('c')
res0: Int = 1

现在很明显,您并没有尝试以toMap作为参数调用c方法。