Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t模式匹配带有'arg::tail'的列表在Scala中工作?_Scala - Fatal编程技术网

为什么';t模式匹配带有'arg::tail'的列表在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

我正在学习Scala函数式编程的Coursera课程,遇到了与语言描述不同的行为。根据模式匹配讲座,在下面的Scala电子表格中,第二个
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
}    
如前所述,它与稳定的标识符有关