2015-08-15 50 views
1

我正在通過在Scala中進行函數式編程的Coursera課程,並遇到似乎與該語言的描述不同的行爲。根據模式匹配的演講,第二println語句的輸出應該false而非true在以下斯卡拉電子表格:爲什麼不在`Scala中使用`arg :: tail`匹配列表模式?

object MatchTest { 
    def test(char: Char, list: List[Char]): Boolean = list match { 
    case char :: tail => true 
    case _   => false 
    }            //> test: (char: Char, list: List[Char])Boolean 

    println(test('a', "ab".toList))     //> true 
    println(test('b', "ab".toList))     //> true 
} 

爲什麼在char :: tail而不是第二個測試賽上_匹配嗎?

回答

2

case char :: tail => truechar變量不是指test()方法參數,但實際上是遮蔽它。

您需要使用:

def test(char: Char, list: List[Char]): Boolean = list match { 
    case `char` :: tail => true 
    case _    => false 
} 

如果你使用反引號,你是對的匹配字符的值。沒有它,你正在創建一個新的變量來匹配任何字符。

有趣的是,你也可以使用第一個大寫字母的變量名。該公約是小寫名稱是指以符合變量,而大寫名稱是指標識符從外範圍:

def test(MyChar: Char, list: List[Char]): Boolean = list match { 
    case MyChar :: tail => true 
    case _   => false 
}  

如前所述here,它與穩定標識符做。