缺少扩展函数的参数类型

时间:2014-05-14 12:46:15

标签: scala intellij-idea

我是Scala的新手,我在阅读Scala in Action一书中的一个例子时遇到了麻烦。

我正在使用IntelliJ,但我也尝试过它作为脚本(REPL)。 scala编译器给出了与IntelliJ相同的错误。 (我正在使用Scala 2.10,如本书所示)。

这是我的代码:

def parseArgs(args: Array[String]): Map[String, List[String]] = {
val command = args.head
val params  = parseArgs(args)
val url = args.last

def nameValuePair(paramName: String) = {
  def values(commaSeparatedValues: String) = commaSeparatedValues.split(",").toList
  // x => x + 2
  val index = args.indexOf(_ == paramName)
  (paramName, if(index == -1) Nil else values(args(index + 1)))
}

  Map(nameValuePair("-d"), nameValuePair("-h"))
}

我得到的信息是:

C:\scala\projects\scripts\restclientscript.scala:12: error: missing parameter type for expanded function ((x$1) => x$1.$eq$eq(paramName))
val index = args.indexOf(_ == paramName)
                         ^
one error found

这与书中所示完全相同,但我无法弄清楚如何使其发挥作用。

方法indexOf实际上也是书中的findIndexOf。但是编译器告诉我的那个方法不存在(以及doc:http://www.scala-lang.org/api/2.10.3/index.html#scala.Array)。

最后,IntelliJ不接受indexOf()方法中的==(突出显示为红色,但编译)。

任何帮助将不胜感激! :)

2 个答案:

答案 0 :(得分:4)

Array.indexOf接受一个应该在数组中找到索引的实例。

如果你想要一个带有谓词的版本,那么Array.indexWhere(至少根据Scala 2.11文档)采用谓词函数p : (T) => Boolean

所以,你可以这样做:

args.indexOf(paramName)

args.indexWhere(_ == paramName)

答案 1 :(得分:4)

这本书可能指的是Scala的旧版本。查看您链接的doc页面,很明显indexOf方法具有以下签名:

indexOf(elem: T): Int

这意味着该方法并不期望一个闭包,而是一个值。您可能想要使用indexWhere:

indexWhere(p: (T) ⇒ Boolean): Int

这应该有用!

还有一个建议是:永远不要相信IntelliJ Idea错误,总是用sbt仔细检查它们,因为Idea使用不同的算法来检查错误,并且不依赖于实际的编译器。