我正在阅读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()}
}
答案 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")
}
}