2016-09-25 3 views
1

Я шел через книгу кулинарии Скала для обработки файлов и натолкнулся на код ниже. Пытался запустить его в моей среде IDE, но получив ошибку. Я что-то пропустил, я никогда раньше не встречал такой синтаксис для массива.Синтаксис деконструкции Array

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

Этот синтаксис в основном соответствует шаблону, применяемому в левой части знака равенства. Массив разбивается на именованные значения в левой части. – Samar

ответ

4

В общем, эта функция называется Extractor Patterns и включен для любого объекта, который имеет метод экземпляра unapply/unapplySeq. Это позволяет вам извлечь заданное значение по конкретному индексу (начало в 0) непосредственно в переменную.

В частности, ваша проблема в том, что вы используете капитализированные имена переменных в шаблоне экстрактора, где имена переменных должны быть в нижнем регистре:

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

@Yuvai спасибо! –

+0

@PriyaranjanSwain Вы приветствуете –

0

Доходы, расходы, прибыль должны начинаться с прописным словом.

После кода работает

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

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

выше шаблон называется extractor pattern.

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") 
    } 
} 
Смежные вопросы