2016-08-26 189 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的列表。