Syntax 为什么这些语句中的一条是用Scala编译的,而另一条不是?

Syntax 为什么这些语句中的一条是用Scala编译的,而另一条不是?,syntax,scala,Syntax,Scala,(注意:我在这里使用的是Scala 2.7.7,而不是2.8) 我正在做一件非常简单的事情——基于一个简单的2列CSV文件中的值创建一个映射——我已经很容易地完成了它,但是我对我的第一次尝试为什么没有编译感到困惑。代码如下: // Returns Iterator[String] private def getLines = Source.fromFile(csvFilePath).getLines // This doesn't compile: def mapping: Map[Strin

注意:我在这里使用的是Scala 2.7.7,而不是2.8)

我正在做一件非常简单的事情——基于一个简单的2列CSV文件中的值创建一个映射——我已经很容易地完成了它,但是我对我的第一次尝试为什么没有编译感到困惑。代码如下:

// Returns Iterator[String]
private def getLines = Source.fromFile(csvFilePath).getLines

// This doesn't compile:
def mapping: Map[String,String] = {
    Map(getLines map { line: String =>
          val pairArr = line.split(",")
          pairArr(0) -> pairArr(1).trim()
        }.toList:_*)
  }

// This DOES compile
def mapping: Map[String,String] = {
    def strPair(line: String): (String,String) = {
      val pairArr = line.split(",")
      pairArr(0) -> pairArr(1).trim()
    }
    Map(getLines.map( strPair(_) ).toList:_*)
  }
编译器错误为

CsvReader.scala:16: 错误:值列表不是的成员 (St环)=>(java.lang.String, java.lang.String)[scalac]可能 原因:可能缺少分号 在“价值清单”之前?[scalac]
}.toList:*)[scalac]^
[scalac]发现一个错误


那么是什么原因呢?除了显式函数定义(在非工作示例中与匿名函数相对)和()与{}之外,它们似乎应该与我等效。如果在非工作示例中用括号替换大括号,则错误为“;”,但找到了“val”。但如果删除局部变量定义并拆分字符串两次,并使用paren而不是大括号,则它将编译。有人能给我解释一下这种差异吗?最好是通过一个Scala文档的链接来解释在用于包围方法参数时括号和大括号之间的差异?

看起来这种差异是因为在第一个示例中使用了运算符符号。如果您添加一组额外的括号,它将起作用:

def mapping: Map[String,String] = {
    Map((getLines map { line: String =>
      val pairArr = line.split(",")
      pairArr(0) -> pairArr(1).trim()
    }).toList:_*)
}
或者,如果不使用运算符语法,它也可以工作

def mapping: Map[String,String] = {
    Map(getLines.map({ line: String =>
      val pairArr = line.split(",")
      pairArr(0) -> pairArr(1).trim()
    }).toList:_*)
}

我认为问题在于,对于方法调用,使用普通方法调用语法比运算符语法具有更高的优先级。这意味着
.toList
应用于匿名函数,而不是
map
方法调用的结果。

如果不使用运算符语法,它可以很好地编译:

//Compiles
def mapping: Map[String,String] = {
    Map(getLines.map { line: String =>
          val pairArr = line.split(",")
          pairArr(0) -> pairArr(1).trim()
        }.toList:_*)
  }
如何使用匿名函数没有问题,但是正如Ben所提到的,没有
的调用
map
的语法并不等同于典型的Java风格的方法调用