[英]Using match .. case in scala
我聽起來可能很傻,但是我是scala的新手,所以請多多包涵。 我對在scala中使用開關盒感到困惑。 按照查找列表的最后一個元素的示例
字母“ h”和“ k”在做什么? 總之,如果有人可以解釋以下內容,我將不勝感激。
def recLast[A](ls: List[A]): A = ls match {
case h :: Nil => h
case b :: rest => recLast(rest)
}
在Scala中, List[A]
是使用單鏈接列表實現的抽象類,它由類型A
的頭元素和類型List[A]
的尾部組成。 具體的實現是Cons
( ::
Cons
,它代表頭和尾, Nil
是空列表。
recLast
發生的recLast
是List[A]
使用稱為模式匹配的功能進行分解。 case
表示我們嘗試匹配的模式。
第一種情況:
case h :: Nil => h
意思是“如果List[A]
包含一個head元素h
和一個為空列表的tail(稱為Nil
),則返回head元素。
第二種情況
case b :: rest => recLast(rest)
手段“萬一List[A]
含有我們結合一個頭元件b
和一個tail
,我們結合rest
,取列表的尾部和遞歸調用recLast
它。
List[A]
上模式匹配的一種方法是使用Cons
類。 通過執行head :: tail
,它以中綴表示法調用::.apply
方法,它等效於::.apply(head, tail)
類的具體實現:
::
:(缺點):
final case class ::[B](override val head: B,
private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
Nil
:
case object Nil extends List[Nothing] {
override def isEmpty = true
override def head: Nothing =
throw new NoSuchElementException("head of empty list")
override def tail: List[Nothing] =
throw new UnsupportedOperationException("tail of empty list")
override def equals(that: Any) = that match {
case that1: scala.collection.GenSeq[_] => that1.isEmpty
case _ => false
}
}
如果列表中有一個元素,則case語句進行模式匹配(即::: Nil,它將與第一種情況匹配,並分配給h,后一種情況做同樣的事情,並將其余(尾部)分配給“休息”
如果您在REPL中寫了以下內容,您也可以看到此模式匹配
scala> val h :: rest = List(1,2,3,4)
h: Int = 1
rest: List[Int] = List(2, 3, 4)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.