繁体   English   中英

为什么其中一个语句在Scala中编译,而另一个则不能?

[英]Why does one of these statements compile in Scala but not the other?

注意 :我在这里使用的是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:错误:toList值不是(St环)的成员=>(java.lang.String,java.lang.String)[scalac]可能的原因:可能在'value toList'之前缺少分号? [scalac]
} .toList:_ *)[scalac] ^
[scalac]发现一个错误

那有什么呢? 除了明确的函数定义(非工作示例中的匿名函数)和()vs. {},它们似乎与我等效。 如果在不起作用的示例中用括号将花括号替换,则错误为“';” 预期,但找到了“ val”。” 但是,如果我删除局部变量定义并将字符串拆分两次,并使用括号而不是大括号,它将进行编译。 有人可以向我解释这种差异,最好是链接到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风格的方法调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM