数组解构语法

时间:2016-09-25 15:02:19

标签: scala pattern-matching

我正在阅读Scala烹饪书中的文件处理,并遇到了下面的代码。试图在我的IDE中运行它,但收到错误。我错过了什么,我之前从未遇到过类似的语法。

import java.io.IOException
import scala.io.{BufferedSource, Source}

object ReadingCSVfile extends App {
  var bufferedSource = None: Option[BufferedSource]
  try {
    bufferedSource =
       Some(
         Source.fromFile(
           "C:\\Users\\pswain\\IdeaProjects\\test1\\src\\main\\resources\\finance.csv")
       )

    for(i <- bufferedSource.get.getLines()) {
      val Array(month, Income, Expenses, Profit) = i.split(",").map(x => x.trim)
      println(s"$month $revenue $expenses $profit")
    }
  } catch {
      case e : IOException => print(e.printStackTrace())
    } finally {bufferedSource.get.close()}
  }

3 个答案:

答案 0 :(得分:4)

通常,此功能称为Extractor Patterns,并且对具有unapply / unapplySeq实例方法的任何对象启用。它的作用是允许您将特定索引(从0开始)的给定值直接提取到变量中。

具体来说,您的问题是您在提取器模式中使用大写变量名称,其中变量名称应为小写:

val Array(month, income, expenses, profit) = i.split(",").map(x => x.trim)

答案 1 :(得分:0)

收入,费用,利润应从小写字母开始。

以下代码正常工作

 val Array(month,income,expenses,profit) = i.split(",").map(x => x.trim)

 println(s"$month $income $expenses $profit")

以上模式称为extractor pattern

答案 2 :(得分:0)

与其他人提到的一样,它被称为extractor patterns。您可以将代码重写为

for(i <- bufferedSource.get.getLines()) {
  i.split(",").map(x => x.trim) match {
  case Array(month, income, expenses, profit) =>
     println(s"$month $revenue $expenses $profit")
  }
}