Scala案例与缺点匹配。这个变量h来自哪里?

时间:2018-04-26 17:29:12

标签: scala

我正在阅读一些Scala问题,我看到了这一点:

def last[A](l: List[A]): A = l match {
  case h :: Nil => h
  case _ :: tail => last(tail)
  case _ => throw new NoSuchElementException
}

我理解cons运算符的基础知识。但是h来自哪里?

在顶部case h,我可以看到我们如何在列表末尾有Nil的情况下说,返回h,这将是列表的最后一个元素。但h甚至定义在哪里?

3 个答案:

答案 0 :(得分:2)

h语句中定义了case

Scala的模式匹配具有非常简洁的语法,可以让人习惯。它混合了一些非常相似的东西:

  • 如果包含文字值,则您匹配的对象必须等于该值。示例:case 1 :: tail => ...仅匹配以1开头的列表。
  • 如果您添加_,则匹配任何内容。示例:case _ :: tail => ...
  • 如果包含一个匹配任何内容的新变量名称,并在相应正文范围内指定与该变量匹配的内容。示例:case h :: tail => ...与前一个示例的输入完全相同,但也会在“h”部分中将第一个元素分配给...

答案 1 :(得分:1)

h是一个标识符,表示A类型的单个元素,并在case子句本身中定义:字母“h”在此上下文中是明智的,因为它明确表示“头。”但是,您可以使用任何合法的Scala标识符:

def last[A](l: List[A]): A = l match {
  case baconWrappedShrimp :: Nil => baconWrappedShrimp
  case _ :: tail => last(tail)
  case _ => throw new NoSuchElementException
}

答案 2 :(得分:0)

Scala模式匹配允许您在案例中编写临时变量。 第一种情况涵盖了l是以下列表{h,Nil}的情况。请注意'::'运算符用于将单个元素与列表连接起来。与连接两个列表的':::'运算符不同。