我是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()方法中的==(突出显示为红色,但编译)。
任何帮助将不胜感激! :)
答案 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使用不同的算法来检查错误,并且不依赖于实际的编译器。