2017-08-11 113 views
1
def listMatch(list:List[Int]): Unit = list match { 
    case a @ ((31 :: tail) :+ 4) => println(tail) 
} 

listMatch(List(31,1,2,3,4)) 

當我運行上面的結果是「列表(1,2,3)」。 所以我的問題是tail函數調用在「println(tail)」語句中引用的位置?顯然,它不是匹配值,因爲「a.tail」調用給出了另一個結果。如果此尾調用引用匹配語句的「list」開頭,則不應該導致結果爲「List(1,2,3,4)」,而是 。 「斯卡拉模式匹配引用混淆內匹配的值

回答

1

有問題的tail是列表的unapplying的head31後的餘數,最後一個元素4。這給我們留下了List(1, 2, 3),這是你看到的結果。綁定到值tail發生在模式匹配內部。

我們可以以提取出不同部分的列表賦值本身的模式匹配:

scala> val list = List(31,1,2,3,4) 
list: List[Int] = List(31, 1, 2, 3, 4) 

scala> val ((head :: tail) :+ 4) = list 
head: Int = 31 
tail: List[Int] = List(1, 2, 3) 

如果我們從不應用刪除+:,我們會得到相同的tail電話爲list.tail,其評估到List(1, 2, 3, 4)

1

這裏,尾部不是函數,它是一個局部值,在匹配的模式中定義。你可以重寫你的榜樣那樣:

def listMatch(list:List[Int]): Unit = list match { 
    case a @ ((31 :: shadok) :+ 4) => println(shadok) 
    }         //> listMatch: (list: List[Int])Unit 

    listMatch(List(31,1,2,3,4))  //> List(1, 2, 3) 
+0

我很笨,謝謝 – altayseyhan