扩展函数缺少参数类型

4

我是Scala的新手,我在阅读《Scala实战》一书时遇到了问题。

我使用IntelliJ进行开发,但我也尝试过使用脚本(REPL)。然而,无论采用哪种工具,Scala编译器都提示同样的错误。(按照书中建议,我使用的是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。但该方法不存在,编译器告诉我(以及文档:http://www.scala-lang.org/api/2.10.3/index.html#scala.Array)。
最后,IntelliJ不会接受indexOf()方法内的==(被标为红色,但可以编译)。
任何帮助都将不胜感激! :)
2个回答

4

Array.indexOf 接受一个需要在数组中查找索引的实例。

如果您想要带谓词的版本,可以使用 Array.indexWhere(至少根据 Scala 2.11 文档),该函数接受一个谓词函数 p : (T) => Boolean

因此,您可以选择执行以下操作:

args.indexOf(paramName)

或者

args.indexWhere(_ == paramName)

感谢你,Patryk! val index = args.indexWhere(_ == paramName) 已经成功了!我也想给你点赞,但我需要15个声望值。非常抱歉 :) - thomas77
1
@thomas77 没问题,很高兴能帮到你 ;) - Patryk Ćwiek

4
这本书可能是指旧版本的Scala。从您提供的文档页面中可以看出,方法indexOf具有以下签名:
indexOf(elem: T): Int

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

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

应该可以工作!

另一个建议是:永远不要相信IntelliJ Idea的错误提示,始终使用sbt进行双重检查。因为Idea使用不同的算法来检查错误,并且不依赖于实际的编译器。


谢谢!我想给你一个+1,但我需要15个声望才能这样做... 当我执行以下操作时它起作用:val index = args.indexWhere(_ == paramName),而且IntelliJ现在也接受它了。这可能是因为我使用的是Java 8 SDK吗? - thomas77
不,我认为Java版本并不重要,关键是Scala本身的版本。 - Aldo Stracquadanio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接