为什么';t模式匹配带有'arg::tail'的列表在Scala中工作?
我正在学习Scala函数式编程的Coursera课程,遇到了与语言描述不同的行为。根据模式匹配讲座,在下面的Scala电子表格中,第二个为什么';t模式匹配带有'arg::tail'的列表在Scala中工作?,scala,Scala,我正在学习Scala函数式编程的Coursera课程,遇到了与语言描述不同的行为。根据模式匹配讲座,在下面的Scala电子表格中,第二个println语句的输出应该是false,而不是true: object MatchTest { def test(char: Char, list: List[Char]): Boolean = list match { case char :: tail => true case _ => false
println
语句的输出应该是false
,而不是true
:
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
上匹配而在上不匹配?案例char::tail=>true
中的char
变量不是指test()
方法参数,而是实际上在隐藏它
您需要使用:
def test(char: Char, list: List[Char]): Boolean = list match {
case `char` :: tail => true
case _ => false
}
如果使用反勾号,则与char的值匹配。如果没有它,您将创建一个与任何字符匹配的新变量
有趣的是,还可以使用第一个大写字母的变量名。约定是小写名称指匹配变量,而大写名称指外部范围的标识符:
def test(MyChar: Char, list: List[Char]): Boolean = list match {
case MyChar :: tail => true
case _ => false
}
如前所述,它与稳定的标识符有关