簡體   English   中英

在scala中使用match..case

[英]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發生的recLastList[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM