2016-08-26 146 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::) - 代表与T类型的headtail链表类型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) 

意思是 “如果这两个headtail非空”。以下匹配谓词基本上窥视存储在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.htmlhttp://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html

它基本上采取的日期列表:与LOCALDATE和代码:字符串。 如果此列表为空或包含一个元素,它将返回一个空列表。 如果以上都不适用,则查看列表的前两个元素,我们称它们为y和z。如果y的值在(z的日期 - 2年)之后,且y和z的代码相同,则返回y和z的列表。