2016-08-26 2 views
2

У меня есть код, написанный кем-то еще. Можете ли вы помочь мне понять этот фрагмент кода?Scala: Код для соответствия шаблону

def sameCodeForTwoYears(list: List[(LocalDate, String)]): List[(LocalDate, String)] = { 
list match { 
    case x :: Nil => List.empty 
    case x :: xs => if (xs.head._1.minusYears(2).isAfter(x._1) && x._2 == xs.head._2) { 
    List(x, xs.head) 
    } else sameCodeForTwoYears(xs) 
    case Nil => List.empty 
    } 
} 

ответ

2

Scalas List[+T] является абстрактным классом, осуществляемый два конкретных классов:

  1. Nil - представляет пустой список
  2. Cons (::) - Представляет собой связанный список с head типа T и tail типа List[+T].

Образец, который вы видите здесь, в основном представляет эти две конструкции. Давайте сделаем прецедентным анализ:

case x :: Nil => List.empty 

Средства «если head не является пустым и tail является пустым списком, вернуть List.empty», который возвращает пустой список.

case x :: xs => if (xs.head._1.minusYears(2).isAfter(x._1) && x._2 == xs.head._2) { 
List(x, xs.head) 

средства «если оба head и tail непусты». Предикаты, следующие за совпадением, в основном рассматривают кортеж, хранящийся внутри List[(LocalDateTime, String)], где _1 представляет первый элемент, а _2 представляет второй элемент. Мы копать немного глубже в смысл, если условие:.

xs.head._1.minusYears(2).isAfter(x._1) 

Средство «взять первый элемент из хвоста (xs, это голова), посмотрите на первый элемент кортежа и вычитать его на 2 года Если первый элемент в x сек кортеже (который является LocalDateTime) после того времени.

И

x._2 == xs.head._2 

средств «взгляд в головы (x) второй элемент, который является String и сопоставить его со следующим элементом, который является хвостом (xs) первым элементом (xs.head) и соответствует обеим строкам для равенства.

Наконец:

case Nil => List.empty 

средства "если список пуст", возвращает пустой список.

+1

thanx ,. Хорошее объяснение –

0

См: http://docs.scala-lang.org/tutorials/tour/pattern-matching.html и http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html

Это в основном принимают в списке даты: LocalDate и и код: String. Если этот список пуст или содержит один элемент, он возвращает пустой список. Если ни одно из вышеприведенных правил не применяется, он смотрит на первые два элемента списка, мы будем называть их y и z. Если y's после (дата z - 2 года), а y и z - то же самое, он возвращает список y и z.

Смежные вопросы